ポリシー情報の管理
LSA には、管理者がローカル コンピューターとドメインのグローバル ポリシー情報のクエリと設定に使用できる機能が用意されています。
ポリシー情報を管理する前に、「 ポリシー オブジェクト ハンドルを開く」で説明されているように、アプリケーションはローカル の Policy オブジェクトへのハンドルを取得する必要があります。 このハンドルは、ポリシー情報を管理する関数で必要です。
ローカル セキュリティ ポリシーに関する情報を取得するには、 LsaQueryInformationPolicy を呼び出します。 ローカル セキュリティ ポリシーを設定するには、 LsaSetInformationPolicy を呼び出します。 POLICY_INFORMATION_CLASS列挙の説明では、クエリまたは設定できるポリシー情報の種類について詳しく説明します。
次の例では、システムの Policy オブジェクトへのハンドルを指定して、システムのアカウント ドメイン情報を取得する方法を示します。
#include <windows.h>
BOOL GetAccountDomainInfo(LSA_HANDLE PolicyHandle)
{
NTSTATUS ntsResult = STATUS_SUCCESS;
PPOLICY_ACCOUNT_DOMAIN_INFO pPADInfo = NULL;
PWCHAR name = NULL;
UINT nameSize;
ntsResult = LsaQueryInformationPolicy(
PolicyHandle, // Open handle to a Policy object.
PolicyAccountDomainInformation, // The information to get.
(PVOID *)&pPADInfo // Storage for the information.
);
if (ntsResult == STATUS_SUCCESS)
{
// There is no guarantee that the LSA_UNICODE_STRING buffer
// is null-terminated, so copy the name to a buffer that is.
nameSize = pPADInfo->DomainName.Length + 1 * sizeof(WCHAR);
name = (WCHAR *) LocalAlloc(LPTR, nameSize);
if (!name)
{
wprintf(L"Failed LocalAlloc\n");
exit(1);
}
wcsncpy_s(name, nameSize, pPADInfo->DomainName.Buffer,
pPADInfo->DomainName.Length);
wprintf(L"The account domain name is %ws\n", name);
LocalFree(name);
if (STATUS_SUCCESS != LsaFreeMemory(pPADInfo))
wprintf(L"LsaFreeMemory error\n");
}
else
{
// Show the corresponding win32 error code.
wprintf(
L"Error obtaining account domain information - (win32) %lu\n",
LsaNtStatusToWinError(ntsResult));
}
return !ntsResult;
}