Comment modifier programmatiquement le mot de passe Active Directory

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 l'épreuve des comptes et de changer les mots de passe.

33
demandé sur Eric 2009-07-01 01:19:30

6 réponses

Vous pouvez utiliser le UserPrincipal de la classe SetPassword méthode, pourvu que vous ayez assez de privilèges, une fois que vous avez trouvé l'objet principal utilisateur correct. Utilisez FindByIdentity pour chercher 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" );

      user.Save();
  }
}
62
répondu tvanfosson 2018-07-03 18:29:25

Voici une excellente référence rapide de programmation Active Directory:

Howto: (Presque) Tout Dans Active Directory via C#

voir le code de réinitialisation du mot de passe près de 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();
}
18
répondu Dana Holt 2015-03-17 13:17:59

essayez ce code. Il 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;
    }
}
12
répondu Rashad Annara 2014-01-21 08:31:24

Voici la solution:

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();
1
répondu Mohamed Hachem 2010-11-09 14:26:44

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 important de vérifier les paramètres à uEntry, le code sera exécuté dans le contexte de sécurité du thread courant, à moins que les valeurs nulles ne soient spécifiées

0
répondu mallas 2014-09-18 11:58:17
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);
    }
}
0
répondu Lavlesh Verma 2018-02-03 06:45:48