Создание пользователя в определенном подразделении в Active Directory с использованием C # - PullRequest
6 голосов
/ 03 января 2012

Большое спасибо marc_s за следующий пример кода из моего предыдущего выпуска Создание пользователя в Active Directory с ошибками C #

public static string ldapPath = "LDAP://OU=Domain Users,DC=contoso,DC=com";
public static string CreateUserAccount(string userName, string userPassword)
{
    // set up domain context
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "contoso.com",ldapPath);

    // create a user principal object
    UserPrincipal user = new UserPrincipal(ctx, userName, userPassword, 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();

    return user.SamAccountName;
}

Теперь я пытаюсь перевести учетную запись пользователя в определенное подразделение. Сохранение ldapPath в ошибках PrincipalContext

System.DirectoryServices.AccountManagement.PrincipalOperationException: Unknown error (0x80005000) ---> System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_SchemaEntry()
   at System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de)
   at System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase, Boolean ownCtxBase, String username, String password, ContextOptions options)
   at System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entry)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
   --- End of inner exception stack trace ---
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.ContextForType(Type t)
   at System.DirectoryServices.AccountManagement.Principal.GetStoreCtxToUse()
   at System.DirectoryServices.AccountManagement.Principal.set_SamAccountName(String value)
   at System.DirectoryServices.AccountManagement.UserPrincipal..ctor(PrincipalContext context, String samAccountName, String password, Boolean enabled)
   at ADINtegrationTest.ActiveDirectory.CreateUserAccount(String userName, String userPassword) in D:\_data\ADINtegrationTest\ADINtegrationTest\ActiveDirectoryUtils.cs:line 20
   at ADINtegrationTest.Form1.Form1_Load(Object sender, EventArgs e) in D:\_data\ADINtegrationTest\ADINtegrationTest\Form1.cs:line 32

И если я удаляю ldapPath, он работает нормально, но выбрасывает учетную запись пользователя в OU пользователя. Я также попытался использовать ldapPath как LDAP: //contoso.com/OU=Domain Users, DC = contoso, DC = com, который не работал.

1 Ответ

15 голосов
/ 03 января 2012

Я думаю, что у вас неправильный путь LDAP для вашего основного конструктора контекста - если вы посмотрите ссылку на статью MSDN, которую я дал вам, вы увидите:

// create a context for a domain called Fabrikam pointed
// to the TechWriters OU and using default credentials
PrincipalContext domainContext = 
   new PrincipalContext(ContextType.Domain, "Fabrikam", "ou=TechWriters,dc=fabrikam,dc=com");

Я тожене уверен, что вы можете использовать доменное имя в стиле интернета contoso.com - попробуйте вместо этого использовать стиль NetBIOS CONTOSO.Так что в вашем случае вы должны попробовать:

public static string ldapPath = "OU=Domain Users,DC=contoso,DC=com";

public static string CreateUserAccount(string userName, string userPassword)
{
     // set up domain context
     PrincipalContext ctx = 
         new PrincipalContext(ContextType.Domain, "CONTOSO", ldapPath);

    // create a user principal object
    .... (and the rest of your code as you had it)
}

Это работает для вас ??

...