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
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");
}
}
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();
}
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();
Dans mon cas, le message suivant s'affiche: "Le serveur refuse de traiter la demande". – Samuel
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;
}
}
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
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
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);
}
}
C'est seulement disponible en .NET 3.5 et plus, BTW (le PrincipalContext et tout). –
N'oubliez pas de 'user.Save()' après. –