Jak zmienić hasło użytkownika usługi Active Directory systemu Windows i usług LDS w usłudze za pośrednictwem protokołu LDAP

Dotyczy: 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

Ten artykuł dotyczy systemu Windows 2000. Pomocy technicznej dla systemu Windows 2000 kończy się w dniu 13 lipca 2010. Centrum rozwiązań Windows 2000 zakończenia wsparcia stanowi punkt wyjścia do planowania strategii migracji z systemu Windows 2000. Aby uzyskać więcej informacji zobacz Zasad cyklu pomocy technicznej firmy Microsoft.

Streszczenie


Można ustawić hasło użytkownika usługi Active Directory systemu Windows i usług LDS w usłudze za pośrednictwem Lightweight Directory protokołu LDAP (Access) biorąc pod uwagę pewne ograniczenia. W tym artykule opisano jak ustawić lub zmienić atrybutu hasło.

Te kroki dotyczą również ADAM i LDS użytkowników i obiektów userProxy w taki sam sposób jak zrobić z użytkowników usługi AD.

Więcej informacji


Hasło jest przechowywane w Reklamie i baza danych usług LDS w usłudze obiektu użytkownika w atrybutu unicodePwd . Tego atrybutu mogą być zapisywane w warunkach ograniczone, ale nie można go odczytać. Można modyfikować tylko atrybut; Nie można dodać na tworzenie obiektów ani przeszukiwać za pomocą wyszukiwania.

Aby zmodyfikować ten atrybut, na kliencie musi być 128-bitowe zabezpieczeń TLS (Transport Layer) / Secure Socket Layer (SSL) połączenia z serwerem. Zaszyfrowaną sesją przy użyciu kluczy sesji SSP utworzone przy użyciu protokołu NTLM lub Kerberos są również dopuszczalne, tak długo, jak długo jest spełniony minimalnej długości klucza.

Aby połączenie powinno być możliwe za pomocą protokołu TLS/SSL:
  • Serwer musi posiadać certyfikat serwera dla połączenia RSA 128-bitowego.
  • Klient musi ufać urząd certyfikacji (CA), który wygenerował certyfikat serwera.
  • Zarówno klient, jak i serwer musi być zdolny do szyfrowania 128-bitowego.


Składnia atrybutu unicodePwd jest ciąg oktetowy; Jednak usługa oczekuje, że ciąg oktetowy będzie zawierać ciąg UNICODE (jak wskazuje nazwa atrybutu). Oznacza to, że wszelkie wartości dla tego atrybutu przekazywane w protokole LDAP musi być ciągi UNICODE, które są zakodowane BER (Basic Encoding Rules) jako ciąg oktetowy. Ponadto ciąg UNICODE musi rozpocząć i kończyć się ofert, które nie są częścią odpowiednie hasło.

Istnieją dwa możliwe sposoby modyfikowania atrybutu unicodePwd . Pierwszym jest podobna do zwykłej "Zmiana hasła użytkownika" operacji. W takim przypadku wniosek Modyfikuj musi zawierać zarówno delete i operacji dodawania. Operacja usuwania musi zawierać bieżące hasło z cudzysłowy wokół niego. Operacji dodawania musi zawierać żądane nowe hasło na cudzysłowy wokół niego.

Drugi sposób, aby zmodyfikować ten atrybut jest analogiczne do resetowania hasła dla użytkownika administratora. W tym celu klient musi powiązania jako użytkownik z uprawnieniami wystarczającymi do modyfikowania hasła innego użytkownika. To żądanie Modyfikuj powinien zawierać pojedynczy zamieniania przy użyciu nowego hasła żądane ujęte w cudzysłowy. Jeśli klient ma wystarczające uprawnienia, to hasło stają się nowe hasło, niezależnie od tego, co było stare hasło.

Następujące dwie funkcje zawierają przykłady tych działań:
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;
}