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); } }
/// <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("データベース初期化が完了しました."); }
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"); } }