Protection du mot de passe d’ouverture de session automatique

Le mot de passe d’ouverture de session automatique doit être protégé à l’aide de la fonction LsaStorePrivateData .

L’exemple suivant montre comment protéger le mot de passe d’ouverture de session automatique. L’exemple récupère un handle sur l’objet Policy en appelant la fonction LsaOpenPolicy . Pour plus d’informations sur l’objet De stratégie et les handles d’objet De stratégie, consultez l’objet De stratégie et l’ouverture d’un handle d’objet de stratégie, respectivement. L’exemple définit ensuite le mot de passe protégé en appelant la fonction LsaStorePrivateData . Notez que si l’appelant passe en NULL pour la valeur de mot de passe protégée, le code efface le mot de passe protégé existant. Avant de quitter, le code ferme le handle à l’objet 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;

}

Notez que si Winlogon ne trouve pas de mot de passe stocké par la fonction LsaStorePrivateData , il utilise la valeur DefaultPassword de la clé Winlogon (s’il existe) pour le mot de passe d’ouverture de session automatique.

Pour plus d’informations sur l’ouverture de session automatique et la clé de Registre Winlogon, consultez MSGina.dll Fonctionnalités.

Pour plus d’informations sur la protection des mots de passe, consultez Gestion des mots de passe.