Het wijzigen van een wachtwoord van de gebruiker Windows Active Directory en LDS via LDAP

Van toepassing: 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

Dit artikel is van toepassing op Windows 2000. Ondersteuning voor Windows 2000 eindigt op 13 juli 2010. Het Einde van de ondersteuning Solution Center voor Windows 2000 is een startpunt voor het plannen van uw migratiestrategie voor van Windows 2000. Zie het Microsoft Support Lifecycle-beleidvoor meer informatie.

Samenvatting


U kunt Windows Active Directory en LDS wachtwoord van een gebruiker via het Lightweight Directory Access Protocol (LDAP) gegeven bepaalde beperkingen instellen. Dit artikel wordt beschreven hoe u kunt instellen of wijzigen van het wachtwoord-kenmerk.

Deze stappen ook van toepassing op ADAM en LDS-gebruikers en userProxy objecten op dezelfde manier als met AD-gebruikers.

Meer informatie


Het wachtwoord is opgeslagen in de AD LDS-database op een gebruikersobject in het kenmerk unicodePwd en. Dit kenmerk kan worden geschreven onder buitengewone omstandigheden, maar kan niet worden gelezen. Het kenmerk kan alleen worden gewijzigd; Deze kan worden toegevoegd op het maken van objecten of opgevraagd door een zoekopdracht.

Om dit kenmerk te wijzigen, moet de client een 128-bits Transport Layer Security (TLS) / Secure Socket Layer (SSL) verbinding met de server. Een gecodeerde sessie met behulp van sessiesleutels die op SSP gemaakt met behulp van NTLM of Kerberos zijn ook aanvaardbaar, mits wordt voldaan aan de minimale sleutellengte.

Met behulp van TLS/SSL voor deze verbinding zijn mogelijk:
  • De server moet beschikken over een certificaat voor een 128-bits RSA-verbinding.
  • De client moet vertrouwt de certificeringsinstantie (CA) die het servercertificaat heeft gegenereerd.
  • Zowel de client als de server moeten 128-bits codering kunnen worden.


De syntaxis van het kenmerk unicodePwd is een octet-tekenreeks; de directory-service verwacht echter dat de octet-tekenreeks een Unicode-reeks bevat (zoals de naam van het kenmerk aangeeft). Dit betekent dat u geen waarden voor dit kenmerk in LDAP doorgegeven moeten Unicode-tekenreeksen die zijn gecodeerd met een BER (Basic Encoding Rules) als een octet-tekenreeks. De Unicode-reeks moet bovendien beginnen en eindigen in offertes die geen deel uitmaken van het gewenste wachtwoord.

Er zijn twee manieren voor het wijzigen van het kenmerk unicodePwd . De eerste is vergelijkbaar met een gewone "gebruikerswachtwoord wijzigen" bewerking. In dit geval bevat verzoek wijzigen zowel een verwijdering en een toevoegingsbewerking. De bewerking moet het huidige wachtwoord door aanhalingstekens rond het bevatten. De toevoegingsbewerking, moet de aanhalingstekens rond het gewenste nieuwe wachtwoord bevatten.

De tweede manier om dit kenmerk te wijzigen is vergelijkbaar met een beheerder voor een gebruiker een wachtwoord opnieuw instellen. Hiervoor moet de client binden als een gebruiker met voldoende machtigingen voor het wijzigen van het wachtwoord van een andere gebruiker. Dit verzoek wijzigen mogen enkel vervangen met het gewenste wachtwoord tussen aanhalingstekens staan. Als de client over voldoende machtigingen beschikt, worden dit wachtwoord het nieuwe wachtwoord, ongeacht wat het oude wachtwoord is.

De volgende twee functies bevatten voorbeelden van deze bewerkingen:
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;
}