2010-02-21 83 views
18

我正在尋找一種方法來創建Active Directory用戶並設置其密碼,最好不給我的應用程序/服務域管理員權限。在C#中使用密碼創建Active Directory用戶

我已嘗試以下步驟:創建

DirectoryEntry newUser = _directoryEntry.Children.Add("CN=" + fullname, USER); 
newUser.Properties["samAccountName"].Value = username; 
newUser.Properties["userPassword"].Value = password; 
newUser.Properties["mail"].Value = email; 
newUser.CommitChanges(); 

用戶,但似乎密碼從未設置的用戶。

有沒有人有想法如何在創建用戶時最初設置用戶密碼?我知道大約

.Invoke("SetPassword", new object[] { password }) 

但這需要我的代碼與域管理員權限運行。由於我真的沒有看到授予我的代碼域管理員權限的意思,只是設置初始密碼(我也允許用戶密碼重置,但是在特定用戶的情況下運行),我希望有人有一個聰明的不需要我這樣做的解決方案。

在此先感謝!

+0

這是我們唯一的選擇,我敢打賭你在同一條船上,但是如果它是一個選項,爲你提供了下面的3.5選項。我有1/4的代碼與'DirectoryEntry'風格是以前唯一的選擇,我**高度推薦給新的名稱空間一看。 – 2010-02-21 12:45:29

回答

25

你可以現在就做這整個過程變得更加容易與System.DirectoryServices.AccountManagement(只要你在淨3.5):

See here for a full rundown

這是你的具體情況一個簡單的例子:

using(var pc = new PrincipalContext(ContextType.Domain)) 
{ 
    using(var up = new UserPrincipal(pc)) 
    { 
    up.SamAccountName = username; 
    up.EmailAddress = email; 
    up.SetPassword(password); 
    up.Enabled = true; 
    up.ExpirePasswordNow(); 
    up.Save(); 
    } 
} 
+3

當你完成後,不要忘記處理上下文和主要對象。這最好在'pc'和'up'上使用''語句來完成。 – tvanfosson 2010-02-21 12:48:32

+0

非常感謝!這似乎是訣竅。 – RajenK 2010-02-21 12:52:40

+0

@tvanfosson - 偉大的一點,即使是快速的例子應該複製/粘貼值得,更新! – 2010-02-21 12:53:34

4

我會使用@ Nick的代碼(包含在using語句中,以便正確處理上下文和主體)。至於權限,您至少需要在創建用戶的OU上擁有足夠的權限才能創建和管理對象。我會創建一個特定的用戶,在該用戶下運行您的程序,併爲其提供足夠的權限,以完成特定OU中所需的任務,而不再需要其他任務。

3

是還可以使用下面的代碼來創建大宗用戶

DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local"); 

     for (int i = 0; i < 10; i++) 
     { 
      try 
      { 
       DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user"); 
       childEntry.CommitChanges(); 
       ouEntry.CommitChanges(); 
       childEntry.Invoke("SetPassword", new object[] { "password" }); 
       childEntry.CommitChanges(); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 
1

與此代碼嘗試的。

DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local"); 

for (int i = 0; i < 10; i++) 
{ 
    try 
    { 
     DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user"); 
     childEntry.CommitChanges(); 
     ouEntry.CommitChanges(); 
     childEntry.Invoke("SetPassword", new object[] { "password" }); 
     childEntry.CommitChanges(); 
    } 
    catch (Exception ex) 
    { 

    } 
} 
相關問題