자동 로그온 암호 보호
LsaStorePrivateData 함수를 사용하여 자동 로그온 암호를 보호해야 합니다.
다음 예제에서는 자동 로그온 암호를 보호하는 방법을 보여줍니다. 이 예제에서는 LsaOpenPolicy 함수를 호출하여 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;
}
Winlogon이 LsaStorePrivateData 함수에 의해 저장된 암호를 찾을 수 없는 경우 자동 로그온 암호에 Winlogon 키의 DefaultPassword 값(있는 경우)을 사용합니다.
자동 로그온 및 Winlogon 레지스트리 키에 대한 자세한 내용은 MSGina.dll 기능을 참조하세요.
암호 보호에 대한 자세한 내용은 암호 처리를 참조하세요.