2010-07-08 31 views
2

我已經編寫了一個程序,它打開與遠程Windows服務器的連接以管理本地帳戶(不是活動目錄)。該程序執行以下步驟:使用C#的遠程Windows服務器上的用戶管理System.DirectoryServices

  • 用戶創建
  • 將用戶添加到組

兩種方法都使用System.DirectoryServices.AccountManagement, 這裏的兩個功能:

public void CreateUser() 
    { 
     PrincipalContext pc = new PrincipalContext(ContextType.Machine, 
      "host_ip", 
      "adminaccount", 
      "adminpassword"); 
     UserPrincipal up = new UserPrincipal(pc); 

     up.Name = "user"; 
     up.DisplayName = "user"; 
     up.SetPassword("user"); 
     up.Description = "user"; 
     up.UserCannotChangePassword = true; 
     up.PasswordNeverExpires = true; 
     try 
     { 
      up.Save(); 
     } 
     catch (Exception ex) 
     { 
     } 
     try 
     { 
      AddToGroup(pc, up); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    private void AddToGroup(PrincipalContext pc, UserPrincipal u) 
    { 
     string group = "Remote Desktop Users"; 

     GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(pc, group); 
     if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName)) //error occurs here 
     { 
      return; 
     } 
     groupPrincipal.Members.Add(u); 
     try 
     { 
      groupPrincipal.Save(); 
     } 
     catch (Exception e) 
     { 
     } 
    } 

它從今天早上開始工作,用戶創建總是成功,但我在線路上收到此錯誤:

  • 如果(groupPrincipal.Members.Contains(PC,IdentityType.SamAccountName,u.SamAccountName))

錯誤(1332),而 枚舉組成員發生。 成員的SID無法解析。

謝謝你的回答

回答

3

不知道這是否會幫助,但根據對Microsoft Connect這份報告,這可能與:

System.DirectoryServices.AccountManagement組的當前版本枚舉要求組中的所有對象都可訪問,否則將引發異常。您所看到的是本地組中列出的對象,該對象不再存在於ActiveDirectory中。由於系統不會自動刪除這些鏈接,因此只要這個組被枚舉,它就會失敗。爲防止此失敗,請移除ActiveDirectory中不再存在的對象的鏈接。我們正在調查在未來的版本中對API進行更改,以便使這種情況更容易處理。

+1

謝謝你馬特, 你可能是對的,我不能找出另一個出身。 有一種方法可以根據MS修復此問題: 「刪除(使用GUI)組中的錯誤SID可解決問題。」 任何想法如何識別錯誤的SID? – adun 2010-07-08 13:36:16

相關問題