web-dev-qa-db-ja.com

C#でパスワードを使用してActive Directoryユーザーを作成する

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 })

ただし、そのためには、コードをドメイン管理者特権で実行する必要があります。コードにドメイン管理者権限を付与するポイントが本当にわからないので、初期パスワードを設定するだけです(ユーザーパスワードのリセットも許可しますが、それらはその特定のユーザーのコンテキストで実行されます)。誰かが賢いことを望んでいます私にそうする必要のない解決策。

前もって感謝します!

24
RajenK

System.DirectoryServices.AccountManagementを使用すると、このプロセス全体をはるかに簡単に実行できます(.Net 3.5を使用している限り)。

詳細はこちらをご覧ください

特定のケースの簡単な例を次に示します。

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();
  }
}
37
Nick Craver

@Nickのコードを使用します(usingステートメントでラップされているため、コンテキストとプリンシパルは適切に破棄されます)。特権については、オブジェクトを作成および管理するユーザーを作成するOUに対して、少なくとも十分な特権が必要です。プログラムを実行する特定のユーザーを作成し、その特定のOUで必要なタスクを実行するのに十分な特権だけを与えます。

4
tvanfosson

はい、以下のコードを使用して大量のユーザーを作成することもできます

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)
    {
    }
}
4
kombsh

このコードで試してください。

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
Munna