Как программно создавать учетные записи пользователей Windows в Windows 7 или Windows Server 2008? - PullRequest
7 голосов
/ 13 мая 2011

Я пытался создать новые локальные учетные записи пользователей на компьютере с Windows 7.Я использовал класс System.DirectoryServices.DirectoryEntry (как в здесь ), но, похоже, он не работает.

Вот код в статье:

static void Main(string[] args)
{
try
    {
 DirectoryEntry AD = new DirectoryEntry("WinNT://" + 
                     Environment.MachineName + ",computer");
 DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");
 NewUser.Invoke("SetPassword", new object[] {"#12345Abc"});
 NewUser.Invoke("Put", new object[] {"Description", "Test User from .NET"});
 NewUser.CommitChanges();
 DirectoryEntry grp;

 grp = AD.Children.Find("Guests", "group");
 if (grp != null) {grp.Invoke("Add", new object[] {NewUser.Path.ToString()});}
 Console.WriteLine("Account Created Successfully");
 Console.ReadLine();
}
catch (Exception ex)
{
 Console.WriteLine(ex.Message);
 Console.ReadLine();

}
}

При выполнении этой строки

DirectoryEntry NewUser = AD.Children.Add("TestUser1", "user");

Я получаю

System.Runtime.InteropServices.COMException с "{"Unknown error (0x80005000)"}"

в качестве сообщения об исключении и -2147463168 в качестве кода ошибки.

Я предполагаю, что это, вероятно, потому что статья предназначена для Windows XP и ниже машин,и я ориентируюсь на Windows 7 и Windows Server 2008.

Любая помощь приветствуется! Обновление: По какой-то таинственной причине я больше не вижу, что System.Runtime.InteropServices.COMException, однако, при внесении изменений здесь newuser.CommitChanges(), я получаю "UnAuthorizedAccessException".Я попытался запустить приложение от имени администратора, но все еще не работает.

Обновление 2: Хорошо, после перехода на класс UserPrincipal, я получил следующий код для работы:

public UserPrincipal CreateNewUser(string sUserName, string sPassword)
        {
            // first check that the user doesn't exist
            if (GetUser(sUserName) == null)
            {
                PrincipalContext oPrincipalContext = GetPrincipalContext();

                UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext);
                oUserPrincipal.Name = sUserName;
                oUserPrincipal.SetPassword(sPassword);
                //User Log on Name
                //oUserPrincipal.UserPrincipalName = sUserName;
                oUserPrincipal.Save();

                return oUserPrincipal;
            }

            // if it already exists, return the old user
            return GetUser(sUserName);
        }
    }

Этот код хорошо работает, когда я запускаю его как консольное приложение - конечно, запускаю от имени администратора - но когда я развернул его как службу Windows, с учетной записью безопасности, установленной как «LocalSystem», я получаю InvlaidOperationException с надписью «Базовое хранилище»не поддерживает это свойство

Мысли?

Ответы [ 2 ]

8 голосов
/ 26 июля 2011

ОК, если вы проверите мое последнее обновление, сработал следующий фрагмент:

public UserPrincipal CreateNewUser(string sUserName, string sPassword)
        {
            // first check that the user doesn't exist
            if (GetUser(sUserName) == null)
            {
                PrincipalContext oPrincipalContext = GetPrincipalContext();

                UserPrincipal oUserPrincipal = new UserPrincipal(oPrincipalContext);
                oUserPrincipal.Name = sUserName;
                oUserPrincipal.SetPassword(sPassword);
                //User Log on Name
                //oUserPrincipal.UserPrincipalName = sUserName;
                oUserPrincipal.Save();

                return oUserPrincipal;
            }

            // if it already exists, return the old user
            return GetUser(sUserName);
        }
    }

Это работало как консольное приложение, но не выполнялось из-за исключений безопасности при развертывании в качестве службы Windows.Решение состоит в том, чтобы доверять этой сборке (сборке службы Windows), чтобы .net security позволила ей работать.Вот и все, теперь все круто!

0 голосов
/ 13 мая 2011

Вам необходимо добавить префикс вашего имени пользователя к CN =, например:

DirectoryEntry NewUser = AD.Children.Add("CN=TestUser1", "user");

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