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

Gilt für: Microsoft Windows Server 2003 Enterprise Edition (32-bit x86)Microsoft Windows Server 2003 Enterprise Edition for Itanium-based SystemsMicrosoft Windows Server 2003 Enterprise x64 Edition

Dieser Artikel bezieht sich auf Windows 2000. Unterstützung für Windows 2000 endet am 13. Juli 2010. Windows 2000 End of Support Solution Center ist ein Ausgangspunkt für die Planung der Strategie für die Migration von Windows 2000. Weitere Informationen finden Sie auf der Microsoft Support Lifecycle Policy.

Zusammenfassung


Sie können ein Windows Active Directory und LDS Benutzerkennwort über das Lightweight Directory Access Protocol (LDAP) angegebenen Einschränkungen festlegen. Dieser Artikel beschreibt das Festlegen oder Ändern des Kennwort-Attributs.

Diese Schritte gelten auch für ADAM und LDS Benutzer und UserProxy Objekte auf die gleiche Weise wie Active Directory-Benutzer.

Weitere Informationen


Gespeichert in AD LDS Datenbank eines Benutzerobjekts im UnicodePwd -Attribut und. Dieses Attribut kann unter Umständen eingeschränkt geschrieben, aber nicht gelesen werden. Das Attribut kann nur geändert werden. nicht am Objekt erstellen oder eine Suche abgefragt.

Um dieses Attribut zu ändern, muss der Client eine 128-Bit-Sicherheit TLS (Transport Layer) / Secure Socket Layer (SSL) Verbindung mit dem Server. Eine verschlüsselte Sitzung mit mit NTLM oder Kerberos-SSP erstellt Sitzungsschlüssel sind auch zulässig, als die minimale Schlüssellänge erfüllt ist.

Für diese Verbindung mithilfe von TLS/SSL möglich:
  • Der Server muss ein Serverzertifikat für eine 128-Bit-RSA-Verbindung verfügen.
  • Der Client muss die Zertifizierungsstelle (CA) vertrauen, die das Zertifikat generiert.
  • Client und Server muss 128-Bit-Verschlüsselung.


Die Syntax des Attributs UnicodePwd ist Oktett. Der Verzeichnisdienst erwartet jedoch den Oktett (wie der Name des Attributs) eine Unicode-Zeichenfolge enthält. Die Werte für dieses Attribut LDAP übergebenen müssen werden Unicode-Zeichenfolgen codiert BER (Basic Encoding Rules) als ein Oktett. Darüber hinaus muss die Unicode-Zeichenfolge beginnen und enden in Anführungszeichen, die nicht das gewünschte Kennwort.

Es gibt zwei Wege zum Ändern des Attributs UnicodePwd . Die erste ähnelt einer normalen "Benutzerkennwort ändern" Vorgang. In diesem Fall muss die Anforderung ändern löschen und eine Add-Operation. Der Löschvorgang muss das aktuelle Kennwort in Anführungszeichen enthalten. Hinzufügen, muss das gewünschte neue Kennwort in Anführungszeichen enthalten.

Die zweite Möglichkeit zum Ändern dieses Attributs entspricht ein Administrator ein Kennwort eines Benutzers zurücksetzen. Dazu muss der Client als Benutzer mit Berechtigungen für das Kennwort eines anderen Benutzers ändern binden. Diese Anforderung ändern sollte einen einzelnes ersetzen-Vorgang mit dem neuen gewünschten Kennwort Anführungszeichen enthalten. Wenn der Client über ausreichende Berechtigungen verfügt, werden dieses Kennwort das neue Kennwort, unabhängig davon, was das alte Kennwort.

Die folgenden beiden Funktionen bieten 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 succesfully 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;
}