2010-02-21 87 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) 
    { 

    } 
} 
相关问题