在XP中更改受限用户帐户失败

时间:2010-12-29 04:33:54

标签: c# .net windows-xp

我有以下内容:

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");

我明白了:
用户:

当我打印它时,看起来就像用户是null一样,但是我又不是一个真正的.Net人 - 我似乎记得这是预期的行为。

1 个答案:

答案 0 :(得分:1)

您确定拥有正确的用户名吗?如果没有匹配,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: