Protección de la contraseña de inicio de sesión automático

La contraseña de inicio de sesión automática 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ática. En el ejemplo se recupera un identificador para el objeto Policy llamando a la función LsaOpenPolicy . Para obtener más información sobre el objeto Policy y los identificadores de objeto Policy , vea Policy object (Objeto de directiva) y Opening a Policy Object Handle (Abrir un identificador de objeto de directiva), 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 autor de la llamada 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 al 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ática.

Para obtener más información sobre el inicio de sesión automático y la clave del Registro de Winlogon, consulte características deMSGina.dll.

Para obtener más información sobre cómo proteger las contraseñas, consulte Control de contraseñas.