Создание пользователя в Active Directory с ошибками C # - PullRequest
1 голос
/ 31 декабря 2011

Я пытаюсь создать пользователя в определенном подразделении в моем домене. Вот что я получил

public static string ldapPath = "LDAP://OU=Domain Users,DC=contoso,DC=com";
public static string CreateUserAccount(string userName, string userPassword)
{
    DirectoryEntry ldapConnection = new DirectoryEntry("contoso.com");
    ldapConnection.Path = ldapPath;

    DirectoryEntry user = ldapConnection.Children.Add("CN=" + userName, "user");

    return user.Guid.ToString();
}

Если я удаляю OU = Domain Users, это работает, и я получаю Guid. Однако мне нужны эти учетные записи в моем OU. Я скопировал ldapPath из самого подразделения в AD Users and Computers. Я знаю, что это правильно.

Я получаю ошибку

System.Runtime.InteropServices.COMException (0x80005009): The specified directory object is not bound to a remote resource

   at System.DirectoryServices.DirectoryEntry.RefreshCache()
   at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName)
   at System.DirectoryServices.DirectoryEntry.get_NativeGuid()
   at System.DirectoryServices.DirectoryEntry.get_Guid()
   at ADINtegrationTest.ActiveDirectory.CreateUserAccount(String userName, String userPassword) in D:\_data\ADINtegrationTest\ADINtegrationTest\ActiveDirectoryUtils.cs:line 21
   at ADINtegrationTest.Form1.Form1_Load(Object sender, EventArgs e) in D:\_data\ADINtegrationTest\ADINtegrationTest\Form1.cs:line 32

Я запускаю это на рядовом сервере Win2k8 для домена, вошедшего в систему как администратор домена. В конечном итоге мне потребуется создать его в подразделении под другим подразделением, но давайте начнем с этого.

Спасибо за помощь! David

Ответы [ 2 ]

2 голосов
/ 31 декабря 2011

Если вы используете .NET 3.5 и выше, вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM).Прочитайте все об этом здесь:

По сути, вы можете определить контекст домена и легко находить пользователей и / или группы в AD:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// create a user principal object
UserPrincipal user = new UserPrincipal(ctx, "User1Acct", "pass@1w0rd01", true);

// assign some properties to the user principal
user.GivenName = "User";
user.Surname = "One";

// force the user to change password at next logon
user.ExpirePasswordNow();

// save the user to the directory
user.Save();

Новый S.DS.AM позволяет действительно легкопоиграйтесь с пользователями и группами в AD!

0 голосов
/ 01 января 2012

Вот пример кода, который позволяет вам создать пользователя, используя System.DirectoryServices:

using System.Collections.Generic;
using System.Text;

using System.DirectoryServices;

namespace Exemple_ADSI12_AddUser
{
  class Program
  {
    static void Main(string[] args)
    {
      /* Connection to Active Directory
       */
      DirectoryEntry deBase = new DirectoryEntry("LDAP://192.168.183.100:389/OU=SousMonou,OU=MonOu,DC=dom,DC=fr", "jpb", "PWD);

      /* User creation
      */
      DirectoryEntry auser = deBase.Children.Add("cn=a User", "user");
      auser.CommitChanges();

      auser.Properties["samaccountname"].Value = "AUser";
      auser.Properties["givenName"].Value = "A";
      auser.Properties["sn"].Value = "User";
      auser.Properties["displayName"].Value = "AUser";
      auser.Properties["userPrincipalName"].Value = "AUser@dom.fr";
      auser.Properties["pwdLastSet"].Value = 0;
      auser.Properties["userAccountControl"].Value = 544;

      auser.CommitChanges();
    }
  }
}

Вы можете обойтись без использования имени пользователя / пароля, но вам нужно создать DirectoryEntry в узле, где вы хотите создать объект. Вы можете заменить LDAP://192.168.183.100:389/OU=SousMonou,OU=MonOu,DC=dom,DC=fr в моем образце на LDAP://contoso.com/OU=Domain Users,DC=contoso,DC=com

...