다음을 통해 공유


자동 로그온 암호 보호

자동 로그온 암호를 보호하기 위해 LsaStorePrivateData 함수를 사용해야 합니다.

자동 로그온 암호를 보호하는 방법을 다음 예제에서 보여 줍니다. Policy 개체에 대한 핸들을 검색하기 위해 LsaOpenPolicy 함수를 호출하는 예제입니다. Policy 개체 및 Policy 개체 핸들 열기를 각각 참조하여 Policy 개체 및 Policy 개체 핸들에 대한 자세한 내용을 확인하세요. 그 후, 보호된 암호를 설정하기 위해 LsaStorePrivateData 함수를 호출합니다. 보호된 암호 값에 대해 호출자가 NULL을 전달하는 경우, 코드는 기존의 보호된 암호를 지웁니다. 종료하기 전, 코드는 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;

}

LsaStorePrivateData 함수에 의해 저장된 암호를 Winlogon이 찾을 수 없는 경우, Winlogon 키의 DefaultPassword 값(있는 경우)을 자동 로그온 암호에 사용합니다.

MSGina.dll 기능을 참조하여 자동 로그온 및 Winlogon 레지스트리 키에 대한 자세한 내용을 확인하세요.

암호 처리를 참조하여 암호 보호에 대한 자세한 내용을 확인하세요.