我在.NET 4.5中使用System.DirectoryServices.AccountManagement
創建帳戶並設置它們的屬性。其中一個要求是從模板帳戶複製組成員(包括主組)。該代碼包括以下內容:使用System.DirectoryServices.AccountManagement時創建Active Directory用戶的延遲
foreach (var group in userPrincipal.GetGroups()) {
var groupPrincipal = (GroupPrincipal) @group;
if (groupPrincipal.Sid != templatePrimaryGroup.Sid) {
groupPrincipal.Members.Remove(userPrincipal);
groupPrincipal.Save();
}
}
這工作的時間約爲90%。中剩下的時間裏,它失敗:
System.DirectoryServices.DirectoryServicesCOMException was unhandled HResult=-2147016656 Message=There is no such object on the server.
Source=System.DirectoryServices ErrorCode=-2147016656 ExtendedError=8333 ExtendedErrorMessage=0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of: 'OU=Whatever,DC=domain,DC=local`
在GetGroups
通話。我的猜測是,在我下一次訪問它之前,用戶沒有完全創建的某種競爭條件。我知道從診斷日誌記錄,我每次都在使用相同的域控制器(它使用相同的PrincipalContext
以符合我的期望),所以它不是複製問題。
我的猜測是否準確?有處理這個問題的好方法嗎?我可以扔一個Sleep
,但這看起來好像是一個警察,最糟糕的情況是脆弱的。那麼,正確的做法是什麼?
用戶帳戶是否已創建?如果您不確定,請在GetGroups()中設置一箇中斷點並檢查。如果該帳戶只是循環創建,直到您可以查詢它的主要組,然後中斷並繼續。 – Daro
它確實被創建,是的。所以基本上你建議我嘗試GetGroups,如果失敗了,等一會兒,然後再試一次,等等。這有點不好意思,但我猜想稍微好一點,而不僅僅是一個固定的延遲。如果這是您的答案,請答覆,以便我可以接受,如果我決定。 –