Protección de la contraseña de inicio de sesión automática
La contraseña de inicio de sesión automático debe protegerse mediante la función LsaStorePrivateData.
En el ejemplo siguiente se muestra cómo proteger la contraseña de inicio de sesión automático. En el ejemplo se recupera un identificador del objeto Policy llamando a la función LsaOpenPolicy. Para obtener más información sobre el objeto Policy y los identificadores de objeto Policy, consulte el objeto Policy y Apertura de un identificador de objeto Policy, respectivamente. A continuación, en el ejemplo se establece la contraseña protegida llamando a la función LsaStorePrivateData. Tenga en cuenta que si el llamador pasa NULL para el valor de contraseña protegida, el código borra la contraseña protegida existente. Antes de salir, el código cierra el identificador del objeto Policy.
#include <windows.h>
#include <stdio.h>
DWORD UpdateDefaultPassword(WCHAR * pwszSecret)
{
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
LSA_HANDLE LsaPolicyHandle = NULL;
LSA_UNICODE_STRING lusSecretName;
LSA_UNICODE_STRING lusSecretData;
USHORT SecretNameLength;
USHORT SecretDataLength;
NTSTATUS ntsResult = STATUS_SUCCESS;
DWORD dwRetCode = ERROR_SUCCESS;
// Object attributes are reserved, so initialize to zeros.
ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
// Get a handle to the Policy object.
ntsResult = LsaOpenPolicy(
NULL, // local machine
&ObjectAttributes,
POLICY_CREATE_SECRET,
&LsaPolicyHandle);
if( STATUS_SUCCESS != ntsResult )
{
// An error occurred. Display it as a win32 error code.
dwRetCode = LsaNtStatusToWinError(ntsResult);
wprintf(L"Failed call to LsaOpenPolicy %lu\n", dwRetCode);
return dwRetCode;
}
// Initialize an LSA_UNICODE_STRING for the name of the
// private data ("DefaultPassword").
SecretNameLength = (USHORT)wcslen(L"DefaultPassword");
lusSecretName.Buffer = L"DefaultPassword";
lusSecretName.Length = SecretNameLength * sizeof(WCHAR);
lusSecretName.MaximumLength =
(SecretNameLength+1) * sizeof(WCHAR);
// If the pwszSecret parameter is NULL, then clear the secret.
if( NULL == pwszSecret )
{
wprintf(L"Clearing the secret...\n");
ntsResult = LsaStorePrivateData(
LsaPolicyHandle,
&lusSecretName,
NULL);
dwRetCode = LsaNtStatusToWinError(ntsResult);
}
else
{
wprintf(L"Setting the secret...\n");
// Initialize an LSA_UNICODE_STRING for the value
// of the private data.
SecretDataLength = (USHORT)wcslen(pwszSecret);
lusSecretData.Buffer = pwszSecret;
lusSecretData.Length = SecretDataLength * sizeof(WCHAR);
lusSecretData.MaximumLength =
(SecretDataLength+1) * sizeof(WCHAR);
ntsResult = LsaStorePrivateData(
LsaPolicyHandle,
&lusSecretName,
&lusSecretData);
dwRetCode = LsaNtStatusToWinError(ntsResult);
}
LsaClose(LsaPolicyHandle);
if (dwRetCode != ERROR_SUCCESS)
wprintf(L"Failed call to LsaStorePrivateData %lu\n",
dwRetCode);
return dwRetCode;
}
Tenga en cuenta que si Winlogon no encuentra una contraseña almacenada por la función LsaStorePrivateData, usará el valor DefaultPassword de la clave Winlogon (si existe) para la contraseña de inicio de sesión automático.
Para obtener más información sobre el inicio de sesión automático y la clave del Registro de Winlogon, consulte Características de MSGina.dll.
Para obtener más información sobre la protección de contraseñas, consulte Control de contraseñas.