Я пытался создать новые локальные учетные записи пользователей на компьютере с 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
с надписью «Базовое хранилище»не поддерживает это свойство
Мысли?