Schützen des Kennworts für die automatische Anmeldung

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

Im folgenden Beispiel wird gezeigt, wie Das Kennwort für die automatische Anmeldung geschützt wird. Im Beispiel wird ein Handle für das Policy-Objekt abgerufen, indem die LsaOpenPolicy-Funktion aufgerufen wird. Weitere Informationen zum Policy-Objekt und den Policy-Objekthandles finden Sie unter Policy-Objekt bzw . Öffnen eines Richtlinienobjekthandles. Im Beispiel wird dann das geschützte Kennwort durch Aufrufen der LsaStorePrivateData-Funktion festgelegt. Beachten Sie, dass der Code das vorhandene geschützte Kennwort löscht, wenn der Aufrufer NULL für den Wert des geschützten Kennworts übergibt. Vor dem Beenden schließt der Code das Handle für das 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.