2012-10-03 107 views
2

我在.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,但這看起來好像是一個警察,最糟糕的情況是脆弱的。那麼,正確的做法是什麼?

+0

用戶帳戶是否已創建?如果您不確定,請在GetGroups()中設置一箇中斷點並檢查。如果該帳戶只是循環創建,直到您可以查詢它的主要組,然後中斷並繼續。 – Daro

+0

它確實被創建,是的。所以基本上你建議我嘗試GetGroups,如果失敗了,等一會兒,然後再試一次,等等。這有點不好意思,但我猜想稍微好一點,而不僅僅是一個固定的延遲。如果這是您的答案,請答覆,以便我可以接受,如果我決定。 –

回答

1

嘗試類似:

 int maxWait = 120; 
     int cnt = 0; 
     bool usable = false; 

     while (usable == false && cnt < maxWait) 
     { 
      try 
      { 
       foreach (var group in userPrincipal.GetGroups()) 
       { 
        var groupPrincipal = (GroupPrincipal)@group; 

        if (groupPrincipal.Sid != templatePrimaryGroup.Sid) 
        { 
         groupPrincipal.Members.Remove(userPrincipal); 
         groupPrincipal.Save(); 
        } 
       } 
       usable = true; 
       break; 
      } 
      catch 
      { 
       System.Threading.Thread.Sleep(500); 
      } 
     } 
     if (usable) 
      //All okay 
      ; 
     else 
      //Do something 
      ; 

這樣,您就可以嘗試 「一會」。如果它工作的很好,如果不能做一些記錄錯誤的事情,那麼你可以稍後運行修復腳本。

+0

這與我最終做的相似 - 足夠接近以至於它可以作爲答案。我不高興我不得不做這樣的事情,但它確實解決了這個問題。 –

+0

問題DC在功能失敗時記錄事件嗎?可能本地AD緩存不足以快速寫入DC ...確保DC和客戶端時間同步,並且在調用失敗後,查看AD中的WhenCreated屬性。 – Daro

+0

回答你的問題:DC事件日誌中沒有什麼有趣的地方。時間同步是好的。考慮到有問題的工具的使用量,我認爲循環的性能下降並不算太糟糕,所以我想現在就讓它繼續下去,除非我有更多時間專注於這個特定問題。謝謝! –

相關問題