Ho un set di account di prova che verranno creati ma gli account verranno configurati per richiedere la modifica della password al primo accesso. Voglio scrivere un programma in C# per passare attraverso gli account di prova e cambiare le password.Come cambiare la password di Active Directory a livello di programmazione
risposta
È 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");
}
}
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();
}
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();
Nel mio caso, ricevo il messaggio: "Il server non è disposto ad elaborare la richiesta". – Samuel
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;
}
}
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
È 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
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);
}
}
Ecco disponibile solo in .NET 3.5 e versioni successive, BTW (PrincipalContext e tutti). –
Ricordarsi di 'user.Save()' in seguito. –