我有以下内容:
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人 - 我似乎记得这是预期的行为。
答案 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: