Невозможно удалить локального пользователя с помощью System.DirectoryServices.AccountManagement.UserPrincipal.Delete () - PullRequest
0 голосов
/ 10 января 2012

Я пытаюсь удалить локальную учетную запись пользователя, используя System.DirectoryServices.AccountManagement.UserPrincipal

Я использую VS 2010, работающий на Windows Server 2008 R2 Enterprise SP1

Вот мой код

using (var ctx = new PrincipalContext(ContextType.Machine))
{
    using (var up = UserPrincipal.FindByIdentity(ctx, "test1"))
    {                        
        if (up != null)
        {
            up.Delete();
        }
    }                       
}

Когда вызывается up.Delete(), я получаю исключение со следующим сообщением:

Объект Active Directory, расположенный по пути WinNT: // DOMAIN / MACHINENAME не является контейнером.

Что я должен сделать, чтобы Delete() заработал?

Ответы [ 2 ]

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

Вот фрагмент кода, который работает для меня:

try
{
  PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "pwd");

  /* Retreive a user
   */
  UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, "user3");
  if (user != null)
    user.Delete();
}
catch (Exception e)
{
  Console.WriteLine(e.Message);
}
Console.WriteLine("Done!");

Отредактировано

Таким образом, для локального компьютера (SAM) это следующее, точно так же, как ваш код, но управление исключениями показывает ошибку acces denied , если код не запущен в приглашении администратора с повышенными правами. Я думаю, что ваша ошибка в этом.

try
{
  PrincipalContext computerContext = new PrincipalContext(ContextType.Machine);

  /* Retreive a user
   */
  UserPrincipal user = UserPrincipal.FindByIdentity(computerContext, "utilisateur1");
  if (user != null)
    user.Delete();
}
catch (Exception e)
{
  Console.WriteLine(e.Message);
}
Console.WriteLine("Done!");

Console.ReadLine ();

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

Вы можете попытаться указать параметр identityType в перегрузке FindByIdentity :

using (var up = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "test1"))
...