2009-06-30 10 views

risposta

57

È possibile utilizzare il metodo di UserPrincipal classe SetPassword, purché si disponga di privilegi sufficienti, una volta trovato l'oggetto UserPrincipal corretta. Utilizzare FindByIdentity per cercare l'oggetto 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"); 
    } 
} 
+3

Ecco disponibile solo in .NET 3.5 e versioni successive, BTW (PrincipalContext e tutti). –

+3

Ricordarsi di 'user.Save()' in seguito. –

18

Ecco una grande programmazione Active Directory riferimento rapido:

Howto: (Almost) Everything In Active Directory via C#

vedere il codice di reimpostazione 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(); 
} 
1

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(); 
+0

Nel mio caso, ricevo il messaggio: "Il server non è disposto ad elaborare la richiesta". – Samuel

11

provare questo codice. Funziona per me,

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; 
    } 
} 
+0

Questo è il metodo migliore per modificare la password da un'app Web. Non crea una cartella utente sul server e cambia la password anziché un ripristino dell'amministratore. Motivi per cui questo è utile elencati qui. https://stackoverflow.com/questions/17493571/directoryservices-userprincipal-setpassword-ignores-password-policy-password-hi – BinaryPatrick

0

È possibile impostare una nuova password per un account di dominio, utilizzando .NET Framework 2.0. Vedere codice funzionante sotto:

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 importan per verificare i parametri a uEntry, il codice verrà eseguito nel contesto di protezione thread corrente, a meno che non vengono specificati i valori nulli

0
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); 
    } 
} 
Problemi correlati