Schützen des Kennworts für die automatische Anmeldung

Das Kennwort für die automatische Anmeldung sollte mithilfe der Funktion LsaStorePrivateData geschützt werden.

Das folgende Beispiel zeigt, wie das automatische Anmeldekennwort geschützt werden kann. Im Beispiel wird ein Handle für das Policy-Objekt abgerufen, indem die Funktion LsaOpenPolicy aufgerufen wird. Weitere Informationen zu den Objekthandles Policy und Policy finden Sie unter Policy-Objekt und >Öffnen eines Policy-Objekthandles. Anschließend wird das geschützte Kennwort durch Aufrufen der LsaStorePrivateData-Funktion festgelegt. Beachten Sie, dass der Code das vorhandene geschützte Kennwort löscht, wenn der Anrufer NULL als Wert für das geschützte Kennwort übergibt. Vor dem Beenden schließt der Code das Handle mit dem Policy-Objekt.

#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;

}

Wenn Winlogon kein Kennwort finden kann, das von der LsaStorePrivateData-Funktion gespeichert ist, verwendet es den DefaultPassword-Wert des Winlogon-Schlüssels (sofern vorhanden) für das Kennwort für die automatische Anmeldung.

Weitere Informationen zur automatischen Anmeldung und zum Winlogon-Registrierungsschlüssel finden Sie unter MSGina.dll Features.

Weitere Informationen zum Schützen von Kennwörtern finden Sie unter Behandeln von Kennwörtern.