Подтвердить что ты не робот

Создать пользователя Active Directory в .NET(С#)

Мне нужно создать нового пользователя в 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();

Таким образом, на самом деле было несколько проблем:

  • CommitChanges должен быть вызван на user (спасибо Rob)
  • Политика паролей предотвращала создание пользователя (спасибо Marc)
4b9b3361

Ответ 1

Я думаю, что вы вызываете CommitChanges в неправильном DirectoryEntry. В документации MSDN (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx) указано следующее (выделено мной мной)

Вы должны вызвать метод CommitChanges в новой записи, чтобы сделать создание постоянным. Когда вы вызываете этот метод, вы можете установить обязательные значения свойств в новой записи. Поставщики имеют разные требования к свойствам, которые необходимо установить перед вызовом метода CommitChanges. Если эти требования не выполняются, поставщик может выдать исключение. Проконсультируйтесь с вашим провайдером, чтобы определить, какие свойства должны быть установлены перед выполнением изменений.

Итак, если вы измените код на user.CommitChanges(), он должен работать, если вам нужно установить больше свойств, чем просто имя учетной записи, тогда вы должны получить исключение.

Поскольку вы в настоящее время вызываете CommitChanges() в OU, который не был изменен, исключений не будет.

Ответ 2

Предполагая, что ваш путь OU OU=x,DC=y,DC=com действительно существует - он должен работать: -)

Что нужно проверить:

  • вы добавляете значение к "samAccountName" - почему бы вам просто не установить его значение:

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

В противном случае у вас может получиться несколько samAccountNames - и это не сработает.....

  • вы не устанавливаете свойство userAccountControl на что-либо - попробуйте использовать:

     user.Properties["userAccountControl"].Value = 512;  // normal account
    
  • У вас есть несколько контроллеров домена в вашей организации? Если вы используете эту привязку без сервера (не указав какой-либо сервер на пути LDAP), вы можете быть удивлены, когда пользователь будет создан:-), и это займет несколько минут до получаса для синхронизации по всей сети.

  • Есть ли у вас строгая политика паролей? Может быть, эта проблема. Я помню, что раньше мы сначала должны были создать пользователя с параметром "не требуется пароль", сделать первый .CommitChanges(), затем создать достаточно мощный пароль, установить его у пользователя и удалить эту опцию пользователя.

Марк

Ответ 3

Проверьте приведенный ниже код

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

            }
        }