Смена учетной записи ограниченного пользователя в XP не удается - PullRequest
0 голосов
/ 29 декабря 2010

У меня есть следующее:

using System;
using System.DirectoryServices.AccountManagement;
public class ChangePassword
{
   public static void Main()
   {    
    PrincipalContext context = new PrincipalContext(ContextType.Machine);
    UserPrincipal user = UserPrincipal.FindByIdentity(context, "someLimitedAccount");
    user.ChangePassword( "xxx", "zzz" );
   }
}

Это прекрасно работает с учетными записями администратора, но, похоже, вылетает, когда я пытаюсь изменить ограниченные учетные записи в XP:

Unhandled Exception: System.NullReferenceException: Object reference not set to
an instance of an object.
   at ChangePassword.Main()

Возможно ли то, что я пытаюсь сделать?Если да, то как?

РЕДАКТИРОВАТЬ # 1:Я добавил следующее:Console.WriteLine( "user: " + user );

Ниже этой строки:UserPrincipal user = UserPrincipal.FindByIdentity(context, "someLimitedAccount");

И я получаю это:user:

Это не выглядит как пользователь null, когда я его печатаю, но опять же я не очень .Net парень - я, кажется, помню, что это ожидаемое поведение.

1 Ответ

1 голос
/ 29 декабря 2010

Вы уверены, что у вас есть правильное имя пользователя?UserPrincipal.FindByIdentity() возвращает null в случае отсутствия совпадения.

С помощью кода того же типа я могу найти локальных учетных записей администратора и ограниченного доступа на компьютерах с Windows 7 и XP(как клиентское приложение .NET 4.0).Кажется, что он не учитывает регистр, но должен быть коротким именем, а не полным именем.Все остальное дает null.

Вы можете получить список всех локальных допустимых имен пользователей, вы можете использовать следующий код:

var pc = new PrincipalContext(ContextType.Machine);
var up = new UserPrincipal(pc);
var users = new PrincipalSearcher(up).FindAll();
foreach (var user in users)
    Console.WriteLine(user);

В сочетании с тестовым кодом:

var pc = new PrincipalContext(ContextType.Machine);
var up = new UserPrincipal(pc);
var users = new PrincipalSearcher(up).FindAll();
foreach (var u in users)
    Console.WriteLine(u.Name);
Console.WriteLine();
Console.Write("User: ");
var name = Console.ReadLine().Trim();
var user = UserPrincipal.FindByIdentity(pc, name);
if (user == null)
    Console.WriteLine("{0} not found", name);
else
{
    Console.WriteLine("Name: {0}", user.Name);
    Console.WriteLine("DisplayName: {0}", user.DisplayName);
}

И некоторые примеры выходных данных

__vmware_user__
Administrator
Guest
Jeff
Share

User: jeff
Name: Jeff
DisplayName: Jeff M
...
User: nonuser
nonuser not found
...
User: guest
Name: Guest
DisplayName:
...