Modifier un mot de passe utilisateur Windows Active Directory et LDS via LDAP

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 LDS (Lightweight Directory Services) 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 utilisateurs en mode d’application Active Directory (ADAM) et LDS et aux objets userProxy de la même façon qu’avec les utilisateurs AD. Pour plus d’informations, consultez les 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 ; Il ne peut pas être ajouté lors de la création d’un objet ou interrogé par une recherche.

Pour modifier cet attribut, le client doit disposer d’une connexion TLS (Transport Layer Security)/SSL (Transport Layer Security) 128 bits au serveur. Une session chiffrée utilisant des clés de session créées par le fournisseur de services partagés à l’aide de NTLM (Windows New Technology LAN Manager) ou Kerberos est également acceptable tant que la longueur minimale de la clé est atteinte.

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 d’un 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’octet contienne une chaîne UNICODE (comme le nom de l’attribut l’indique). Cela signifie que toutes les valeurs de cet attribut passées dans LDAP doivent être des chaînes UNICODE encodées en 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 de modification de mot de passe de l’utilisateur standard. Dans ce cas, la demande de modification doit contenir à la fois une opération de suppression et d’ajout. L’opération de suppression doit contenir le mot de passe actuel avec des guillemets. L’opération d’ajout doit contenir le nouveau mot de passe souhaité avec des guillemets.

La deuxième façon de modifier cet attribut est analogue à celle d’un administrateur qui réinitialise 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 seule opération de remplacement avec 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 la 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 : Ne pas autoriser le transfert des informations d’identification (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