2009-06-30 41 views

Respuesta

57

Puede utilizar el UserPrincipal clase SetPassword método, siempre y cuando tenga suficientes privilegios, una vez que haya encontrado el objeto UserPrincipal correcta. Use FindByIdentity para buscar el objeto principal en cuestión.

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

Eso es solo disponible en .NET 3.5 y superior, BTW (PrincipalContext y todo). –

+3

Recuerde 'usuario.Guardar()' después. –

18

Aquí hay una gran programación de Active Directory de referencia rápida:

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

ver el código de restablecimiento de contraseña cerca del final.

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

Aquí está la solución:

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

En mi caso, recibo el mensaje: "El servidor no está dispuesto a procesar la solicitud". – Samuel

11

probar este código. Funciona para mí,

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

Este es el mejor método para cambiar la contraseña de una aplicación web. No crea una carpeta de usuario en el servidor y cambia la contraseña en lugar de un restablecimiento de administrador. Razones por las cuales esto es beneficioso enumerado aquí. https://stackoverflow.com/questions/17493571/directoryservices-userprincipal-setpantword-ignores-password-policy-password-hi – BinaryPatrick

0

Es posible establecer una nueva contraseña a una cuenta de dominio, mediante el uso de .NET Framework 2.0. Ver el código de trabajo abajo:

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

es muy importan para comprobar los parámetros en uEntry, el código se ejecutará bajo el contexto de seguridad del subproceso actual, a menos que los valores nulos se especifican

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); 
    } 
} 
Cuestiones relacionadas