Ändern eines Windows Active Directory- und LDS-Benutzerkennworts über LDAP

In diesem Artikel wird beschrieben, wie Sie ein Windows Active Directory- und LDS-Benutzerkennwort über LDAP ändern.

Gilt für: Windows Active Directory
Ursprüngliche KB-Nummer: 269190

Zusammenfassung

Basierend auf bestimmten Einschränkungen können Sie ein Kennwort für Windows Active Directory und Lightweight Directory Services (LDS) über das Lightweight Directory Access Protocol (LDAP) festlegen. In diesem Artikel wird beschrieben, wie Das Kennwort-Attribut festgelegt oder geändert wird.

Diese Schritte gelten auch für Active Directory-Anwendungsmodus (ADAM) und LDS-Benutzer und userProxy-Objekte auf die gleiche Weise wie bei AD-Benutzern. Weitere Informationen finden Sie unter zusätzliche Hinweise am Ende des Artikels.

Weitere Informationen

Das Kennwort wird in der AD- und LDS-Datenbank für ein Benutzerobjekt im unicodePwd-Attribut gespeichert. Dieses Attribut kann unter eingeschränkten Bedingungen geschrieben, aber nicht gelesen werden. Das Attribut kann nur geändert werden. sie kann nicht bei der Objekterstellung hinzugefügt oder von einer Suche abgefragt werden.

Um dieses Attribut zu ändern, muss der Client über eine 128-Bit-TLS-/SSL-Verbindung (Transport Layer Security) mit dem Server verfügen. Eine verschlüsselte Sitzung mit von SSP erstellten Sitzungsschlüsseln mit Windows New Technology LAN Manager (NTLM) oder Kerberos ist ebenfalls zulässig, solange die mindeste Schlüssellänge erfüllt ist.

Damit diese Verbindung mit TLS/SSL möglich ist:

  • Der Server muss über ein Serverzertifikat für eine 128-Bit-RSA-Verbindung verfügen.
  • Der Client muss der Zertifizierungsstelle vertrauen, die das Serverzertifikat generiert hat.
  • Client und Server müssen 128-Bit-Verschlüsselung können.

Die Syntax des unicodePwd-Attributs ist octet-string; Der Verzeichnisdienst erwartet jedoch, dass die Oktettzeichenfolge eine UNICODE-Zeichenfolge enthält (wie der Name des Attributs angibt). Dies bedeutet, dass alle Werte für dieses Attribut, das in LDAP übergeben wird, UNICODE-Zeichenfolgen sein müssen, die BER-codiert (Grundlegende Codierungsregeln) als Oktettzeichenfolge sind. Darüber hinaus muss die UNICODE-Zeichenfolge in Anführungszeichen beginnen und enden, die nicht Teil des gewünschten Kennworts sind.

Es gibt zwei Möglichkeiten, das unicodePwd-Attribut zu ändern. Die erste ähnelt einem regulären Vorgang zum Ändern des Kennworts durch Benutzer. In diesem Fall muss die Änderungsanforderung sowohl einen Lösch- als auch einen Add-Vorgang enthalten. Der Löschvorgang muss das aktuelle Kennwort mit Anführungszeichen enthalten. Der Vorgang zum Hinzufügen muss das gewünschte neue Kennwort mit Anführungszeichen enthalten.

Die zweite Möglichkeit zum Ändern dieses Attributs ist analog zum Zurücksetzen eines Kennworts für einen Benutzer durch einen Administrator. Dazu muss der Client als Benutzer mit ausreichenden Berechtigungen gebunden werden, um das Kennwort eines anderen Benutzers zu ändern. Diese Änderungsanforderung sollte einen einzelnen Ersetzungsvorgang mit dem neuen gewünschten Kennwort in Anführungszeichen enthalten. Wenn der Client über ausreichende Berechtigungen verfügt, wird dieses Kennwort zum neuen Kennwort, unabhängig davon, was das alte Kennwort war.

Die folgenden beiden Funktionen enthalten Beispiele für diese Vorgänge:

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;
}

Tipp

  • Um LDS-Instanzen mit UserProxy-Objekten für Kennwortzurücksetzungen zu konfigurieren, müssen Sie die eingeschränkte Delegierung des LDS-Dienstkontos (Standard: LDS-Computerkonto) an die Domänencontroller zulassen, falls die Benutzeranmeldung Kerberos verwendet.
  • Wenn Sie einfache LDAP-Bindung verwenden, müssen Sie Windows Server 2022 oder eine neuere Version verwenden und einen Registrierungseintrag festlegen, um die Anmeldeinformationen der LDAP-Administratorsitzung an den Active Directory-Domäne Controller weiterzuleiten:
    Registrierungsschlüssel: HKLM\system\currentcontrolset\services<LDS Instance>\Parameters
    Registrierungseintrag: ClearText-Anmeldetyp zulassen
    Typ: REG_DWORD
    Daten: 0: Weiterleitung von Anmeldeinformationen nicht zulassen (Standard)
              1: Weiterleitung von Anmeldeinformationen für die Kennwortzurücksetzung zulassen
  • Beachten Sie, dass die Änderung in beiden Fällen bedeutet, dass der LDS-Server als Tier-0-Gerät betrachtet werden sollte, da es sicherheitsrelevante Aufgaben auf dem Domänencontroller starten kann.

Gilt für

  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows Server 2012 R2 Datacenter
  • Windows Server 2012 R2 Standard
  • Windows Server 2016
  • Windows Server 2019
  • Windows Server 2022
  • Windows 8.1 Enterprise
  • Windows 8.1 Pro
  • Windows 10
  • Windows 11