我获得了一个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 (作为查询结果)。
发布于 2013-03-05 10:35:26
据我所知,解决问题的唯一办法如下:
Domain.DomainControllers检索所有可用的域控制器,并查询每个控制器直到找到对象我不太喜欢这两种方式,但我找不到其他的选择。请随意提出更好的选择。
https://stackoverflow.com/questions/14813661
复制相似问题