私は、Windows サービスとして作成された Active Directory 同期ツール (.NET 2.0 / C#) を持っており、これにしばらく取り組んでおり、最近、グループ メンバーシップの変更に基づいてイベントを駆動する機能を追加する任務を負っています。基本的なシナリオは、ユーザーがセキュリティ データベースと同期され、グループ メンバーシップが変更された場合、ユーザーのアクセス権を変更する必要があるというものです (つまり、私が "IT スタッフ" のメンバーになった場合、自動的にアクセス権を受け取る必要があります)。そのグループから削除された場合、サーバー ルームへのアクセスは自動的に失われます)。
問題は、グループに対して DirectorySynchronization を実行すると、メンバーが追加/削除されたグループが返され、そこからメンバー リストを取得すると、そのグループ内のすべてのメンバーのリストが返されることです。追加または削除されました。これはかなり効率的な問題につながります。つまり、ユーザーが追加または削除されたかどうかを知るために、各グループとすべてのメンバーのリストをローカルに保持し、それを現在のリストと比較して、誰が追加または削除されたかを確認する必要があります。追加された (ローカル リストではなく)、および削除されたユーザー (現在のメンバー リストではなくローカル リスト)。
グループ メンバーシップの詳細をメモリ内の DataSet に保存し、新しいメンバーシップの変更を処理するたびにディスクに書き込むことについて議論しています。そうすれば、サービスが停止/クラッシュしたり、マシンが再起動したりした場合でも、ディスク上の最後の情報と現在のグループ メンバーシップ リストの情報を比較することで、セキュリティ データベース内の Active Directory の現在の状態を取得できます。ただし、これは非常に非効率的です。グループ内のすべてのメンバーを実行してデータセットの内容と比較し、リストに変更があるたびに変更をディスクに書き込みます。
誰かが以前にこのシナリオを扱ったことがありますか? グループ メンバーのデルタのみを取得する方法はありますか? この状況で、パフォーマンスへの影響を最小限に抑えながら変更を見逃さないようにするにはどうしますか?
編集: AD には 500 人のユーザーが含まれている可能性があり、200,000 人のユーザーが含まれている可能性があります。