我得到了一个 Active Directory 域,在其中我在某个新创建的 OU 下创建组对象,如下所示,例如 SubOuB 下的组。GlobalGroups 下的全局组已经存在。
+MainOu
+--SubOuA
+--GroupA_A
+--GroupA_B
+--GroupA_C
+--SubOuB
+--GroupB_A
...
+GlobalGroups
+--GlobalGroupA
+--GlobalGroupB
...
现在我想将新创建的 OU 下新添加的组作为成员添加到全局组之一,例如将 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,直到预期的对象确实可用(作为查询结果)。