2013-02-11 24 views
0

我已經獲得了一個Active Directory域,我在其中創建了一個新創建的OU下的組對象,如下所示。 SubOuB下的組。 GlobalGroups下的全球團體已經在那裏。如何避免groupPrincipal.Members.Add拋出NoMatchingPrincipalException

+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,直到預期的對象確實可用(作爲查詢結果)。

回答

-1

據我所知,以解決我的問題的唯一方法如下:

  • 要麼是所建議的在我的問題,並定期查詢「您的」域控制器,直到期望對象變爲可用或可配置超時達到
  • 通過Domain.DomainControllers檢索所有可用的域控制器,並詢問他們每個人,直到你的對象找到

我也不喜歡太多,但我無法找到任何其他選項。請隨時提出更好的替代方案。