我已經獲得了一個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,直到預期的對象確實可用(作爲查詢結果)。