Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article explique comment modifier un mot de passe utilisateur Windows Active Directory et LDS via LDAP.
S’applique à : Windows Active Directory
Numéro de la base de connaissances d’origine : 269190
Résumé
En fonction de certaines restrictions, vous pouvez définir un mot de passe Windows Active Directory et Lightweight Directory Services (LDS) via le protocole LDAP (Lightweight Directory Access Protocol). Cet article explique comment définir ou modifier l’attribut de mot de passe.
Ces étapes s’appliquent également aux objets ADAM (Active Directory Application Mode) et LDS et userProxy de la même façon qu’avec les utilisateurs AD. Pour plus d’informations, consultez des conseils supplémentaires à la fin de l’article.
Plus d’informations
Le mot de passe est stocké dans la base de données AD et LDS sur un objet utilisateur dans l’attribut unicodePwd . Cet attribut peut être écrit dans des conditions restreintes, mais ne peut pas être lu. L’attribut ne peut être modifié que ; elle ne peut pas être ajoutée lors de la création d’objets ou interrogée par une recherche.
Pour modifier cet attribut, le client doit disposer d’une connexion TLS (Secure Socket Layer Layer) 128 bits au serveur. Une session chiffrée utilisant des clés de session créées par SSP à l’aide du Gestionnaire NTLM (Windows New Technology LAN Manager) ou Kerberos est également acceptable tant que la longueur minimale de la clé est remplie.
Pour que cette connexion soit possible à l’aide de TLS/SSL :
- Le serveur doit posséder un certificat de serveur pour une connexion RSA 128 bits.
- Le client doit approuver l’autorité de certification qui a généré le certificat de serveur.
- Le client et le serveur doivent être capables de chiffrement 128 bits.
La syntaxe de l’attribut unicodePwd est octet-string . Toutefois, le service d’annuaire s’attend à ce que la chaîne d’octets contienne une chaîne UNICODE (comme le nom de l’attribut indique). Cela signifie que toutes les valeurs de cet attribut passées dans LDAP doivent être des chaînes UNICODE encodées ber (règles d’encodage de base) en tant que chaîne d’octets. En outre, la chaîne UNICODE doit commencer et se terminer par des guillemets qui ne font pas partie du mot de passe souhaité.
Il existe deux façons de modifier l’attribut unicodePwd . La première est similaire à une opération régulière de modification du mot de passe par l’utilisateur. Dans ce cas, la demande de modification doit contenir à la fois la suppression et une opération d’ajout. L’opération de suppression doit contenir le mot de passe actuel avec des guillemets autour de celui-ci. L’opération d’ajout doit contenir le nouveau mot de passe souhaité avec des guillemets autour de celui-ci.
La deuxième façon de modifier cet attribut est analogue à une réinitialisation par un administrateur d’un mot de passe pour un utilisateur. Pour ce faire, le client doit établir une liaison en tant qu’utilisateur disposant des autorisations suffisantes pour modifier le mot de passe d’un autre utilisateur. Cette demande de modification doit contenir une opération de remplacement unique par le nouveau mot de passe souhaité entouré de guillemets. Si le client dispose d’autorisations suffisantes, ce mot de passe devient le nouveau mot de passe, quel que soit l’ancien mot de passe.
Les deux fonctions suivantes fournissent des exemples de ces opérations :
ULONG ChangeUserPassword(WCHAR* pszUserDN, WCHAR* pszOldPassword,WCHAR* pszNewPassword)
{
ULONG err = 1;
LDAPMod modNewPassword;
LDAPMod modOldPassword;
LDAPMod *modEntry[3];
BERVAL newPwdBerVal;
BERVAL oldPwdBerVal;
BERVAL *newPwd_attr[2];
BERVAL *oldPwd_attr[2];
WCHAR pszNewPasswordWithQuotes[1024];
WCHAR pszOldPasswordWithQuotes[1024];
// Build an array of LDAPMod.
// For setting unicodePwd, this MUST be a double op.
modEntry[0] = &modOldPassword;
modEntry[1] = &modNewPassword;
modEntry[2] = NULL;
// Build mod struct for unicodePwd Add.
modNewPassword.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;
modNewPassword.mod_type =L"unicodePwd";
modNewPassword.mod_vals.modv_bvals = newPwd_attr;
// Build mod struct for unicodePwd Delete.
modOldPassword.mod_op = LDAP_MOD_DELETE | LDAP_MOD_BVALUES;
modOldPassword.mod_type =L"unicodePwd";
modOldPassword.mod_vals.modv_bvals = oldPwd_attr;
// Password will be single valued, so we only have one element.
newPwd_attr[0] = &newPwdBerVal;
newPwd_attr[1]= NULL;
oldPwd_attr[0] = &oldPwdBerVal;
oldPwd_attr[1]= NULL;
// Surround the passwords in quotes.
wsprintf(pszNewPasswordWithQuotes,L"\"%s\"",pszNewPassword);
wsprintf(pszOldPasswordWithQuotes,L"\"%s\"",pszOldPassword);
// Build the BER structures with the UNICODE passwords w/quotes.
newPwdBerVal.bv_len = wcslen(pszNewPasswordWithQuotes) * sizeof(WCHAR);
newPwdBerVal.bv_val = (char*)pszNewPasswordWithQuotes;
oldPwdBerVal.bv_len = wcslen(pszOldPasswordWithQuotes) * sizeof(WCHAR);
oldPwdBerVal.bv_val = (char*)pszOldPasswordWithQuotes;
// Perform single modify.
err = ldap_modify_s(ldapConnection,
pszUserDN,
modEntry
);
if (err == LDAP_SUCCESS )
wprintf(L"\nPassword successfully changed!\n");
else
wprintf(L"\nPassword change failed!\n");
return err;
}
ULONG SetUserPassword(WCHAR* pszUserDN, WCHAR* pszPassword)
{
ULONG err = 1;
LDAPMod modPassword;
LDAPMod *modEntry[2];
BERVAL pwdBerVal;
BERVAL *pwd_attr[2];
WCHAR pszPasswordWithQuotes[1024];
// Build an array of LDAPMod.
// For setting unicodePwd, this MUST be a single op.
modEntry[0] = &modPassword;
modEntry[1] = NULL;
// Build mod struct for unicodePwd.
modPassword.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;
modPassword.mod_type =L"unicodePwd";
modPassword.mod_vals.modv_bvals = pwd_attr;
// Password will be single valued, so we only have one element.
pwd_attr[0] = &pwdBerVal;
pwd_attr[1]= NULL;
// Surround the password in quotes.
wsprintf(pszPasswordWithQuotes,L"\"%s\"",pszPassword);
// Build the BER structure with the UNICODE password.
pwdBerVal.bv_len = wcslen(pszPasswordWithQuotes) * sizeof(WCHAR);
pwdBerVal.bv_val = (char*)pszPasswordWithQuotes;
// Perform single modify.
err = ldap_modify_s(ldapConnection,
pszUserDN,
modEntry
);
if (err == LDAP_SUCCESS )
wprintf(L"\nPassword succesfully set!\n");
else
wprintf(L"\nPassword set failed!\n");
return err;
}
Conseil
- Pour configurer des instances LDS à l’aide d’objets UserProxy pour les réinitialisations de mot de passe, vous devez autoriser la délégation contrainte du compte de service LDS (par défaut : compte d’ordinateur LDS) aux contrôleurs de domaine au cas où l’ouverture de session utilisateur utilise Kerberos.
- Si vous utilisez une liaison simple LDAP, vous devez utiliser Windows Server 2022 ou une version plus récente et définir une entrée de Registre pour transférer les informations d’identification de session LDAP administrateur au contrôleur domaine Active Directory :
Clé de Registre : HKLM\system\currentcontrolset\services<LDS Instance>\Parameters
Entrée de Registre : Autoriser le type d’ouverture de session ClearText
Type : REG_DWORD
Données : 0 : N’autorisez pas le transfert d’informations d’identification (valeur par défaut)
1 : Autoriser le transfert des informations d’identification pour la réinitialisation du mot de passe - Notez que la modification dans les deux cas signifie que le serveur LDS doit être considéré comme un appareil de niveau 0, car il peut démarrer des tâches sensibles à la sécurité sur le contrôleur de domaine.
S’applique à
- Windows Server 2012 Datacenter
- Windows Server 2012 Standard
- Windows Server 2012 R2Centre de données
- Windows Server 2012 R2 Standard
- Windows Server 2016
- Windows Server 2019
- Windows Server 2022
- Windows 8.1 Entreprise
- Windows 8.1 Professionnel
- Windows 10
- Windows 11