web-dev-qa-db-ja.com

.NETでActive Directoryユーザーを作成する(C#)

Active Directoryに新しいユーザーを作成する必要があります。次のような例がいくつか見つかりました。

using System;
using System.DirectoryServices;

namespace test {
   class Program {
      static void Main(string[] args) {
        try {
            string path = "LDAP://OU=x,DC=y,DC=com";
            string username = "johndoe";

            using (DirectoryEntry ou = new DirectoryEntry(path)) {
               DirectoryEntry user = ou.Children.Add("CN=" + username, "user");

               user.Properties["sAMAccountName"].Add(username);

               ou.CommitChanges();
            }
         } 
         catch (Exception exc) {
             Console.WriteLine(exc.Message);
         }
      }
   }
}

このコードを実行してもエラーは発生しませんが、新しいユーザーは作成されません。

テストを実行しているアカウントには、ターゲットの組織単位でユーザーを作成するための十分な権限があります。

私は何か(おそらくユーザーオブジェクトのいくつかの必須属性)を欠いていますか?

コードが例外を与えない理由は何ですか?

[〜#〜]編集[〜#〜]
以下は私にとってうまくいきました:

int NORMAL_ACCOUNT = 0x200;
int PWD_NOTREQD = 0x20;
DirectoryEntry user = ou.Children.Add("CN=" + username, "user");
user.Properties["sAMAccountName"].Value = username;
user.Properties["userAccountControl"].Value = NORMAL_ACCOUNT | PWD_NOTREQD;
user.CommitChanges();

したがって、実際にはいくつかの問題がありました。

  1. CommitChangesuserで呼び出す必要があります(Robに感謝)
  2. パスワードポリシーにより、ユーザーを作成できませんでした(Marcに感謝)
20
Paolo Tedesco

間違ったDirectoryEntryでCommitChangesを呼び出していると思います。 MSDNドキュメント( http://msdn.Microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx )には、次のように記載されています(強調は私が追加したものです)

作成を永続的にするには、CommitChangesメソッド新しいエントリ上を呼び出す必要があります。このメソッドを呼び出すと、新しいエントリに必須のプロパティ値を設定できます。プロバイダーはそれぞれ、CommitChangesメソッドの呼び出しが行われる前に設定する必要があるプロパティに対して異なる要件を持っています。これらの要件が満たされていない場合、プロバイダーは例外をスローする可能性があります。プロバイダーに確認して、変更をコミットする前に設定する必要があるプロパティを確認してください。

したがって、コードをuser.CommitChanges()に変更すると機能するはずです。アカウント名だけでなく、より多くのプロパティを設定する必要がある場合は、例外。

現在、変更されていないOUでCommitChanges()を呼び出しているため、例外はありません。

16
RobV

OUパスを想定しているOU=x,DC=y,DC=comは実際に存在します-動作するはずです:-)

確認すること:

  • 「samAccountName」に値を追加しています-値を設定してみませんか。

    user.Properties["sAMAccountName"].Value = username;
    

そうしないと、いくつかのsamAccountNameが作成される可能性があります-機能しません。

  • あなたはuserAccountControlプロパティを何にも設定していません-使ってみてください:

     user.Properties["userAccountControl"].Value = 512;  // normal account
    
  • 組織に複数のドメインコントローラーがありますか?あなたが、この「サーバーレス」バインディングを使用している場合(LDAPパスでサーバーを指定していない場合)、ユーザーが作成される場所に驚かれる可能性があります:-)数分から最大30分かかります。ネットワーク全体で同期する

  • 厳格なパスワードポリシーを導入していますか?多分それが問題です。最初に「パスワードを必要としない」オプションを使用してユーザーを作成し、最初に.CommitChanges()を実行してから、十分に強力なパスワードを作成してユーザーに設定し、そのユーザーオプションを削除する必要がありました。

マーク

8
marc_s

以下のコードを確認してください

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

        for (int i = 3; i < 6; 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)
            {

            }
        }
0
kombsh