Cómo cambiar una contraseña de usuario de Active Directory de Windows y LDS a través de LDAP

Se aplica: 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

En este artículo se aplica a Windows 2000. De soporte técnico para Windows 2000 finaliza el 13 de julio de 2010. El Centro de soluciones de fin de soporte de Windows 2000 es un punto de partida para planear la estrategia de migración desde Windows 2000. Para obtener más información, consulte la Directiva de ciclo de vida de soporte técnico de Microsoft.

Resumen


Puede establecer la contraseña de un usuario de Active Directory de Windows y LDS mediante el ligero LDAP Directory Access Protocol () ante ciertas restricciones. En este artículo se describe cómo establecer o cambiar el atributo de contraseña.

Estos pasos también se aplican a los usuarios de ADAM y LDS y objetos userProxy de la misma manera como hace con los usuarios de AD.

Más información


La contraseña se almacena en Active Directory y la base de datos en un objeto de usuario en el atributo unicodePwd LDS. Este atributo se puede escribir en condiciones restringidas, pero no se puede leer. Sólo se puede modificar el atributo; no se ha añadido en la creación de objetos o consultado por una búsqueda.

Para modificar este atributo, el cliente debe tener 128 bits Transport Layer Security (TLS) o conexión de Secure Socket Layer (SSL) con el servidor. Una sesión cifrada mediante claves de sesión de SSP creado mediante NTLM o Kerberos son también aceptables, siempre y cuando se cumpla la longitud de clave mínima.

Para que esta conexión sea posible mediante TLS/SSL:
  • El servidor debe disponer de un certificado de servidor para una conexión de RSA de 128 bits.
  • El cliente debe confiar en la entidad emisora de certificados (CA) que generó el certificado del servidor.
  • Tanto el cliente como el servidor deben ser capaces de cifrado de 128 bits.


La sintaxis del atributo unicodePwd es la cadena de octeto; Sin embargo, el servicio de directorio espera que la cadena de octeto contendrá una cadena UNICODE (como indica el nombre del atributo). Esto significa que los valores de este atributo se pasan en LDAP debe ser cadenas UNICODE que están codificados en BER (Basic Encoding Rules) como una cadena de octetos. Además, la cadena UNICODE debe comienzan y finalizan en las ofertas que no forman parte de la contraseña que desee utilizar.

Hay dos formas posibles para modificar el atributo unicodePwd . Es similar a un "usuario cambiar la contraseña" normal la primera operación. En este caso, la solicitud de modificación debe contener una eliminación y una operación de agregar. La operación de eliminación debe contener la contraseña actual con comillas alrededor de él. La operación de agregar debe contener la nueva contraseña deseada con comillas alrededor de él.

La segunda forma de modificar este atributo es análoga a un administrador que restablecer la contraseña de un usuario. Para ello, debe enlazar el cliente como un usuario con permisos suficientes para modificar la contraseña de otro usuario. La solicitud de modificación debe contener una operación de reemplazo único con la nueva contraseña deseada entrecomillada comillas. Si el cliente tiene suficientes permisos, esta contraseña se convierten en la nueva contraseña, independientemente de cuál era la contraseña antigua.

Las dos funciones siguientes proporcionan ejemplos de estas operaciones:
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;
}