I am writing a csharp windows form application which attempts to check for the existence of a local account and if found set the password on it. A couple of key points:
I'm doing this for local accounts - NOT Active Directory accounts. The machines are not members of a windows AD domain.
I HAVE to use setpassword not changepassword as change password requires you to know the previous password which in some cases I do not. Setpassword is supposed to allow you to select a new password without having to know the old one
The application will be run by approximately 50 users using a variety of OS's from Windows XP all the way up to Windows Server 2008 R2. Because I can't predict what operating system and version of .net will be available I have set my target framework as .net 2.0.
I am expecting my user to be running as an administrator presently so I don't think permissions are an issue. I can create uses just fine I just can't set password on an existing account.
Here's my code:
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);
}
}
Here's the error I am receiving:
I can't figure out why I'm getting the above error and despite googling and searching stack overflow I can't find any explanation. Most examples I can find revolve around connecting to Active Directory - not local accounts. Or are using newer .net 4.0 features. I have to believe that if I can create an account I should be able to set the password on an account. Any ideas or suggestions on what I might be doing wrong?
Thanks Brad
I've run in to similarly obfuscated errors when using ActiveDirectory libraries. What I've found to be immensely helpful is using the Microsoft Network Monitor to track messages being sent to/from LDAP. Usually the error message being sent back has much more detail.
EDIT: I would recommend the following to help debug your communication issues:
CommitChanges
CommitChanges
lineAt this point you can scroll through the messages to see where your calls occurred.
EDIT2: Here's a reference to the DirectoryEntry.Path. It shows the WinNT formatting for connecting to a user as:
WinNT:// < domain name> / < computer name > / < user name >
User contributions licensed under CC BY-SA 3.0