2009-06-30 6 views
32

J'ai un ensemble de comptes de test qui vont être créés mais les comptes seront configurés pour exiger un changement de mot de passe lors de la première connexion. Je veux écrire un programme en C# pour passer en revue les comptes de test et changer les mots de passe.Comment modifier par programme le mot de passe Active Directory

Répondre

57

Vous pouvez utiliser la méthode SetPassword classe UserPrincipal, à condition que vous avez assez de privilèges, une fois que vous avez trouvé l'objet UserPrincipal correct. Utilisez FindByIdentity pour rechercher l'objet principal en question.

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

C'est seulement disponible en .NET 3.5 et plus, BTW (le PrincipalContext et tout). –

+3

N'oubliez pas de 'user.Save()' après. –

18

Voici une grande programmation Active Directory référence rapide:

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

Voir le code de réinitialisation de mot de passe à la fin.

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

est la solution ici:

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

Dans mon cas, le message suivant s'affiche: "Le serveur refuse de traiter la demande". – Samuel

11

Essayez ce code. Cela fonctionne pour moi,

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

C'est la meilleure méthode pour changer le mot de passe d'une application Web. Il ne crée pas de dossier utilisateur sur le serveur et modifie le mot de passe à la place d'une réinitialisation de l'administrateur. Raisons pour lesquelles cela est bénéfique énumérés ici. https://stackoverflow.com/questions/17493571/directoryservices-userprincipal-setpassword-ignores-password-policy-password-hi – BinaryPatrick

0

Il est possible de définir un nouveau mot de passe à un compte de domaine, en utilisant .NET Framework 2.0. Voir le code de travail ci-dessous:

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

il est très importan pour vérifier les paramètres à uEntry, le code se déroulera dans le contexte actuel de sécurité du fil, à moins que les valeurs nulles sont spécifiées

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