Windows программно создает пользователя во всех случаях - PullRequest
0 голосов
/ 16 января 2019

Я хочу создать пользователя с программой (c #, .net 4.5):

String Domain =  System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
...
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
{
    if (UserPrincipal.FindByIdentity(pc, IdentityType.UserPrincipalName, USER) != null)
    {
        .. error message ..
    ...

По крайней мере, это работает для доменов. Но создание локального пользователя (создание на компьютере, принадлежащем к домену или автономному компьютеру) не сработало (исполняющий пользователь - администратор - ручное добавление пользователя работает).

Я пытался установить для Domain-Name значение

  • System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties () HostName;.
  • "локальный"
  • "127.0.0.1"

Но затем я получил следующее сообщение об ошибке на FindByIdentity :

System.DirectoryServices.AccountManagement.PrincipalServerDownException: 
Mit dem Server konnte keine Verbindung hergestellt werden. ---> 
System.DirectoryServices.Protocols.LdapException: Der LDAP-Server ist nicht verfügbar.

(немецкий, я добавил разрывы строк) Грубо говоря: «Не удалось подключиться к серверу -> LDAP-сервер недоступен».

Я также изменил PrincipalContext на

using (PrincipalContext pc = new PrincipalContext(ContextType.Machine, Domain))

(и протестировал все домены, как указано выше). Затем я получил следующее сообщение об ошибке на FindByIdentity :

System.IO.FileNotFoundException: Der Netzwerkpfad wurde nicht gefunden.

(немецкий) Грубо переводится: «Сетевой путь не найден».

(Все протестировано в Windows 10 (в домене) и «чистой» доменной Windows 7).

Что я могу сделать, чтобы это работало И просто имел один кодовый путь для всех случаев.

(Подсказка Я также протестировал удаление доменного имени из PrincipalContext и добавление его к пользователю "@" + Домен.)

Редактировать

using (PrincipalContext pc = new PrincipalContext(ContextType.Machine))
{
    if (UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, USER) != null)
    {
        .. error message ..
    ...

работает для локального доступа на компьютере без домена.

1 Ответ

0 голосов
/ 22 января 2019

Как и просил мой текущий код для создания пользователей, если локально или домен:

static internal bool CreateUser(String Domain, out String UserName, out String Pwd, out String error)
{
    bool localhost = (String.IsNullOrWhiteSpace(Domain) || Domain.Trim().Equals("localhost", StringComparison.InvariantCultureIgnoreCase) || Domain.Trim().StartsWith("127.") || Domain.Trim().Equals(System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().HostName.Trim(), StringComparison.InvariantCultureIgnoreCase));
    Console.WriteLine("Domain: " + Domain + (localhost ? " (localhost)" : ""));

    UserName = null;
    Pwd = null;
    try
    {
        ContextType cType = localhost ? ContextType.Machine : ContextType.Domain;
        Domain = localhost ? null : Domain;
        IdentityType iType = localhost ? IdentityType.SamAccountName : IdentityType.UserPrincipalName;

        using (PrincipalContext pc = new PrincipalContext(cType, Domain))
        {
            // Search for an non existent User
            int nr = 0;
            while (UserPrincipal.FindByIdentity(pc, iType, USER + (nr > 0 ? "" + nr : "")) != null) 
            {
                nr++;
                if (nr > 1000)
                {
                    error = "Could not create a user name - all possible names are in use. Please delete unnessesary users.";
                    return false;
                }
            } 

            UserName = USER + (nr > 0 ? "" + nr : "");
            Pwd = Membership.GeneratePassword(64, 8);

            String desciption = "User for bla!"

            using (UserPrincipal up = new UserPrincipal(pc))
            {
                up.SamAccountName = UserName;
                if (!localhost)
                {
                    up.GivenName = UserName;
                    up.UserPrincipalName = UserName;
                }
                up.DisplayName = "User";
                up.Description = desciption;
                up.SetPassword(Pwd);
                up.Enabled = true;
                up.UserCannotChangePassword = true;
                up.PasswordNeverExpires = true;
                up.Save();
            }

            int max = 600;
            // Now Wait until User is known
            while (UserPrincipal.FindByIdentity(pc, iType, UserName) == null)
            {
                Thread.Sleep(100);
                if (max-- <= 0)
                {
                    error = "User was not created in wait time.";
                    return false;
                }
            }
        }
        error = null;
        return true;
    }
    /*catch (PrincipalExistsException)
    {
        // Should not happen now
        error = null;
        return false;
    }*/
    catch (UnauthorizedAccessException e)
    {
        error = "Executeing user has insufficent permissions. Need the permission to create user in the domain: \"" + Domain + "\":\n" + e;
        return false;
    }
    catch (Exception e)
    {
        error = e.ToString();
        return false;
    }
}

Надеюсь, это поможет одному или двум людям ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...