Så här ändrar du en användarlösenord för Windows Active Directory och LDS via LDAP

Gäller 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

Den här artikeln gäller Windows 2000. Support för Windows 2000 slutar den 13 juli 2010. Slutet av Support Solution Center för Windows 2000 är en utgångspunkt för att planera en migreringsstrategi för från Windows 2000. Mer information finns i Microsoft Support Lifecycle-policyn.

Sammanfattning


Du kan ange en Windows Active Directory och LDS användares lösenord via det Lightweight Directory Access Protocol (LDAP) anges vissa begränsningar. Den här artikeln beskrivs hur du ange eller ändra lösenord-attribut.

Dessa åtgärder gäller också för ADAM och LDS-användare och userProxy-objekt på samma sätt som du gjort med AD-användare.

Mer Information


Lösenordet lagras i AD LDS-databas på ett användarobjekt i attributet unicodePwd och. Det här attributet kan skrivas under begränsade förhållanden, men det går inte att läsa. Attributet kan bara ändras. den kan inte läggas till för objektet eller efterfrågas av en sökning.

Klienten måste ha en 128-bitars Transport Layer Security (TLS) för att ändra attributet / Secure Socket Layer (SSL)-anslutning till servern. En krypterad session med SSP Skapa sessionsnycklar med NTLM eller Kerberos kan också godtas som minsta nyckellängd är uppfyllda.

För den här anslutningen ska vara möjligt att använda TLS/SSL:
  • Servern måste ha ett servercertifikat för en 128-bitars RSA-anslutning.
  • Klienten måste lita på certifikatutfärdaren (CA) som genererade certifikatet.
  • Både klienten och servern måste kunna 128-bitars kryptering.


Syntaxen för attributet unicodePwd är en oktett-sträng; dock förväntas katalogtjänsten oktett-sträng som innehåller en Unicode-sträng (som anger namnet på attributet). Detta innebär att alla värden för det här attributet skickas i LDAP måste vara Unicode-strängar som är kodade BER (Basic Encoding Rules) som en oktett-sträng. Unicode-strängen måste dessutom börjar och slutar i offerter som inte är önskade lösenordet.

Det finns två möjliga sätt att ändra attributet unicodePwd . Först liknar en normal ”ändra lösenord” operation. I detta fall måste ändra begäran innehålla både en ta bort och en Lägg till åtgärd. Borttagningsåtgärden måste innehålla det aktuella lösenordet med citattecken runt den. Åtgärden Lägg till måste innehålla det nya önskade lösenordet med citattecken runt den.

Det andra sättet att ändra det här attributet är detsamma som en administratör återställa ett lösenord för en användare. Klienten måste binda som en användare med tillräcklig behörighet för att ändra en annan användares lösenord för att göra detta. Ändra begäran ska innehålla en enda Ersätt med det nya önskade lösenordet som omges av citattecken. Om klienten har tillräcklig behörighet, blir det nya lösenordet, oavsett vad det gamla lösenordet var lösenordet.

Följande två funktioner ger exempel på sådana åtgärder:
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;
}