Partager via


Protection du mot de passe automatique d’ouverture de session

Le mot de passe de connexion automatique doit être protégé en utilisant la fonction LsaStorePrivateData.

L’exemple suivant montre comment protéger le mot de passe de connexion automatique. L’exemple récupère un handle vers l’objet Policy en appelant la fonction LsaOpenPolicy. Pour plus d’informations sur l’objet Policy et les handles d’objets Policy, veuillez respectivement consulter les sections Objet Policy et Ouverture d’un handle d’objet Policy. L’exemple définit ensuite le mot de passe protégé en appelant la fonction LsaStorePrivateData. Notez que si l’appelant passe NULL pour la valeur du mot de passe protégé, le code efface le mot de passe protégé existant. Avant de quitter, le code ferme le handle de 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 un mot de passe stocké par la fonction LsaStorePrivateData, il utilisera la valeur DefaultPassword de la clé Winlogon (si elle existe) pour le mot de passe de connexion automatique.

Pour plus d’informations sur la connexion automatique et la clé de registre Winlogon, veuillez consulter la section Fonctionnalités de MSGina.dll.

Pour plus d’informations sur la protection des mots de passe, veuillez consulter la section Gestion des mots de passe.