示例#1
0
        static void notifier_ObjectChanged(object sender, ObjectChangedEventArgs e)
        {
            SearchResultEntry result = e.Result;

            logger.Info("Changed:" + result.DistinguishedName);

            if (!isUserAccount(result))
            {
                logger.Info("Not a user Account");
                return;
            }

            if (logger.IsDebugEnabled)
            {
                foreach (string attrib in e.Result.Attributes.AttributeNames)
                {
                    foreach (var item in e.Result.Attributes[attrib].GetValues(typeof(string)))
                    {
                        logger.DebugFormat("\t{0}: {1}", attrib, item);
                    }
                }
            }

            var samAccountName = result.Attributes["samAccountName"].GetValues(typeof(string)).Cast <string>().First <string>();

            /// ユーザーを作成しようとしたが,必須項目が入力されていなかったり,
            /// パスワードの要件が満たされなかった場合,変更イベントは送信されるが,
            /// その後アカウントが存在しない状況が発生する.
            /// そういった状況を避けるため,30秒後に再度クエリを実行し,ユーザーアカウントが取得できることを確認する.
            System.Threading.Thread.Sleep(30000);
            if (!searcher.isExist(samAccountName))
            {
                logger.InfoFormat(@"{0} の変更要求を受け取りましたが,ディレクトリ上に見つかりませんでした.", samAccountName);
                return;
            }


            ///
            if (HistoryManager.isExist(samAccountName))
            {
                logger.Info(samAccountName + @" は作成済みキャッシュにあります.");
                return;
            }

            try
            {
                invokeCommand(samAccountName);
                HistoryManager.add(samAccountName, true);
            }
            catch (Exception exception)
            {
                logger.Error("コマンド実行エラー", exception);
            }
        }
示例#2
0
        /// <summary>
        /// 初回起動向けに,全てのユーザーアカウントに対して,ディレクトリ作成済みフラグを付けます.
        /// </summary>
        static void firstRun()
        {
            logger.Info("初回起動のため,データベース初期化を行います.");

            HistoryManager.connect();
            HistoryManager.initialize();

            DirectorySearcher src = new DirectorySearcher("(objectClass=User)");

            foreach (SearchResult result in src.FindAll())
            {
                HistoryManager.add(result.Properties["samAccountName"].OfType <string>().First(), false);
            }

            logger.Info("データベース初期化が完了しました.");
        }
示例#3
0
        static void Main(string[] args)
        {
            logger.Info("Startup");

            if (!File.Exists(HistoryManager.dbFile))
            {
                firstRun();
            }

            HistoryManager.connect();

            string domain   = Environment.ExpandEnvironmentVariables("%USERDNSDOMAIN%");
            string domainDN = @"DC=" + domain.Replace(@".", @",DC=");

            try
            {
                logger.Info("ドメインコントローラーへの接続を試行してます.");
                using (LdapConnection connect = new LdapConnection(domain))
                    using (ChangeNotifier notifier = new ChangeNotifier(connect))
                    {
                        //register some objects for notifications (limit 5)
                        notifier.Register(domainDN, ldapFilter,
                                          System.DirectoryServices.Protocols.SearchScope.Subtree);

                        notifier.ObjectChanged += new EventHandler <ObjectChangedEventArgs>(notifier_ObjectChanged);

                        logger.Info("ドメインコントローラーへの接続に成功しました.変更監視を開始します.");

                        Console.ReadLine();
                    }
            }
            finally
            {
                logger.Info("Shutdown");
            }
        }