Come cambiare la password di Active Directory al livello di programmazione

Ho una serie di account di prova che verranno creati ma gli account verranno configurati per richiedere la modifica della password al primo accesso. Voglio scrivere un programma in C # per passare attraverso gli account di prova e cambiare le password.

È ansible utilizzare il metodo SetPassword della class UserPrincipal , a condizione che si disponga di privilegi sufficienti, una volta individuato l’object UserPrincipal corretto. Utilizzare FindByIdentity per cercare l’object principale in questione.

using (var context = new PrincipalContext( ContextType.Domain )) { using (var user = UserPrincipal.FindByIdentity( context, IdentityType.SamAccountName, userName )) { user.SetPassword( "newpassword" ); // or user.ChangePassword( "oldPassword", "newpassword" ); user.Save(); } } 

Ecco un ottimo riferimento alla programmazione di Active Directory:

Howto: (quasi) tutto in Active Directory tramite C #

Vedere il codice di reimpostazione della password vicino alla fine.

 public void ResetPassword(string userDn, string password) { DirectoryEntry uEntry = new DirectoryEntry(userDn); uEntry.Invoke("SetPassword", new object[] { password }); uEntry.Properties["LockOutTime"].Value = 0; //unlock account uEntry.Close(); } 

Prova questo codice. Per me funziona,

 public void ChangeMyPassword(string domainName, string userName, string currentPassword, string newPassword) { try { string ldapPath = "LDAP://192.168.1.xx"; DirectoryEntry directionEntry = new DirectoryEntry(ldapPath, domainName + "\\" + userName, currentPassword); if (directionEntry != null) { DirectorySearcher search = new DirectorySearcher(directionEntry); search.Filter = "(SAMAccountName=" + userName + ")"; SearchResult result = search.FindOne(); if (result != null) { DirectoryEntry userEntry = result.GetDirectoryEntry(); if (userEntry != null) { userEntry.Invoke("ChangePassword", new object[] { currentPassword, newPassword }); userEntry.CommitChanges(); } } } } catch (Exception ex) { throw ex; } } 

Ecco la soluzione:

 string newPassword = Membership.GeneratePassword(12, 4); string quotePwd = String.Format(@"""{0}""", newPassword); byte[] pwdBin = System.Text.Encoding.Unicode.GetBytes(quotePwd); UserEntry.Properties["unicodePwd"].Value = pwdBin; UserEntry.CommitChanges(); 

È ansible impostare una nuova password per un account di dominio, utilizzando .NET Framework 2.0. Vedi sotto il codice di lavoro:

 string domainfqdn="mydomain.test.gov" //fqdn of the domain string ldapPath =GetObjectDistinguishedName (objectClass.user,returnType.distinguishedName, args[0].ToString(),domainfqdn); ldapPath="LDAP://" + domainfqdn + :389/"+ldapPath; DirectoryEntry uEntry = new DirectoryEntry(ldapPath,null,null,AuthenticationTypes.Secure); uEntry.CommitChanges(); Console.WriteLine(ldapPath); string password="myS3cr3tPass" uEntry.Invoke("SetPassword", new object[] { password }); uEntry.Properties["LockOutTime"].Value = 0; //unlock account uEntry.CommitChanges(); uEntry.Close(); 

è molto importante controllare i parametri su uEntry, il codice verrà eseguito con il contesto di sicurezza thread corrente, a meno che i valori nulli non siano specificati

 public void ResetPassword(string userName, string Password, string newPassword) { try { DirectoryEntry directoryEntry = new DirectoryEntry(Path, userName, Password); if (directoryEntry != null) { DirectorySearcher searchEntry = new DirectorySearcher(directoryEntry); searchEntry.Filter = "(samaccountname=" + userName + ")"; SearchResult result = searchEntry.FindOne(); if (result != null) { DirectoryEntry userEntry = result.GetDirectoryEntry(); if (userEntry != null) { userEntry.Invoke("SetPassword", new object[] { newPassword }); userEntry.Properties["lockouttime"].Value = 0; } } } } catch (Exception ex) { Log.Error("Password Can't Change:" + ex.InnerException.Message); } }