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 Sie das kennwort für die automatische Anmeldung schützen. Im Beispiel wird ein Handle für das Policy-Objekt abgerufen, indem die Funktion LsaOpenPolicy aufgerufen wird. Weitere Informationen zu den Richtlinienobjekt - und Richtlinienobjekthandles finden Sie unter Policy-Objektobjekt und Öffnen eines Richtlinienobjekthandles. Anschließend wird das geschützte Kennwort durch Aufrufen der Funktion LsaStorePrivateData festgelegt. Beachten Sie, dass wenn der Aufrufer null für den geschützten Kennwortwert übergibt, dann löscht der Code das vorhandene geschützte Kennwort. 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;

}

Beachten Sie, dass, wenn Winlogon kein Kennwort finden kann, das von der Funktion LsaStorePrivateData gespeichert ist, den DefaultPassword-Wert des Winlogon-Schlüssels (sofern vorhanden) für das automatische Anmeldekennwort verwendet.

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

Weitere Informationen zum Schutz von Kennwörtern finden Sie unter Behandeln von Kennwörtern.