以下に示すように、特定の新しく作成された OU の下にグループ オブジェクトを作成する Active Directory ドメインを取得しました。たとえば、SubOuB の下のグループです。GlobalGroups の下のグローバル グループは既に存在します。
+MainOu
+--SubOuA
+--GroupA_A
+--GroupA_B
+--GroupA_C
+--SubOuB
+--GroupB_A
...
+GlobalGroups
+--GlobalGroupA
+--GlobalGroupB
...
ここで、新しく作成された OU の下に新しく追加されたグループをメンバーとしてグローバル グループの 1 つに追加します。たとえば、GroupA_A をメンバーとして GlobalGroupB に追加します。
using( PrincipalContext principalContext =
new PrincipalContext( ContextType.Domain, Environment.UserDomainName ) )
{
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(
principalContext, "GlobalGroupB" );
if( groupPrincipal != null )
{
// Target group found.
groupPrincipal.Members.Add( principalContext, IdentityType.Name, "GroupA_A" );
// The next line throws a NoMatchingPrincipalException.
groupPrincipal.Save();
}
}
AD 構造とオブジェクトを見ると、両方のオブジェクトが見えます。ADSI エディターは、両方の「名前」が正しいことを示しています。新しい OU とグループ オブジェクトを作成した後、テスト アプリケーションでコードを手動で実行すると、グループをメンバーとしてグローバル グループに追加しても問題なく動作します。私が使用したすべてのコードは、同じ構造の AD を使用したステージング環境で動作するため、本番環境で問題が発生する理由がわかりません。
何か案は?DirectoryEntry
オブジェクトには、特定のオブジェクトのプロパティ値を強制的に再読み込みするメソッドがあることを確認しましRefreshCache
たが、これがここで役立つとは思いません。私の問題はタイミングの問題ですか?新しく作成されたグループが検出され、グローバル グループに追加できるように、既存のオブジェクトを強制的に「リロード」することはできますか?
アップデート
これは間違いなく AD 同期の問題のようです。新しく作成されたグループ オブジェクトの存在を継続的にチェックすると (例: Thread.Sleep( 1000 ) でループ)、私のコードは期待どおりに動作します。欠点は、どれくらい待たなければならないかわからないことです (テストは私の環境では 6 秒から 15 秒の間で変化しました)。また、これは非常に汚いアプローチだと思います。残念ながら、AD オブジェクトを「リフレッシュ」する方法やキャッシュを「フラッシュ」する方法に関する情報は見つかりませんでした。
更新 2
特定のドメイン コントローラーに接続すると、最初のクエリが遅くなり (3000 ミリ秒以上)、後続のクエリが高速になり、すべてが返るのにほぼ同じ時間がかかります。期待されるオブジェクトが実際に (クエリの結果として) 利用可能になるまで、定期的に AD にクエリを実行することを回避する方法はまだわかりません。