我正在编写一个csharp Windows窗体应用程序,它试图检查是否存在本地帐户,如果找到则设置密码。几个关键点:
我为本地帐户执行此操作 - 不是Active Directory帐户。这些计算机不是Windows AD域的成员。
我必须使用setpassword而不是更改密码,因为更改密码要求您知道以前的密码,在某些情况下我不知道。 Setpassword应该允许您选择新密码而不必知道旧密码
该应用程序将由大约50名用户运行,使用各种操作系统从Windows XP一直到Windows Server 2008 R2。因为我无法预测.net的操作系统和版本是什么,所以我将目标框架设置为.net 2.0。
我希望我的用户目前以管理员身份运行,所以我不认为权限是个问题。我可以很好地创建用途我只能在现有帐户上设置密码。
这是我的代码:
public void VerifiyAccount()
{
String username = "specialaccount";
String password = "SuperSecretPassw0rd!";
if (CheckIfAccountExists(username))
{
MessageBox.Show("User Account all ready exists.");
SetUserPassword(password);
}
else
{
MessageBox.Show("User Account does not exist");
CreateUserAccount(username, password);
}
}
public void SetUserPassword(string newPassword)
{
try
{
DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://" + Environment.MachineName + ", specialaccount");
hostMachineDirectory.Invoke("SetPassword", newPassword);
hostMachineDirectory.CommitChanges();
hostMachineDirectory.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
这是我收到的错误:
我无法弄清楚为什么我会收到上述错误,尽管谷歌搜索和搜索堆栈溢出我无法找到任何解释。我发现的大多数示例都围绕连接到Active Directory而不是本地帐户。或者正在使用更新的.net 4.0功能。我必须相信,如果我可以创建一个帐户,我应该能够在帐户上设置密码。关于我可能做错的任何想法或建议?
由于 布拉德
答案 0 :(得分:2)
使用ActiveDirectory库时,我遇到了类似的混淆错误。我发现非常有帮助的是使用Microsoft Network Monitor来跟踪发送到LDAP或从LDAP发送的消息。通常,发回的错误消息有更多细节。
编辑:我建议您使用以下内容来帮助调试您的通信问题:
CommitChanges
CommitChanges
行此时,您可以滚动浏览消息以查看呼叫发生的位置。
EDIT2 :这是对DirectoryEntry.Path的引用。它显示用于连接到用户的WinNT格式:
WinNT://<域名> /<计算机名称> /<用户名>