ポリシー オブジェクト ハンドルを開く
ほとんどの LSA ポリシー関数では、システムがクエリまたは変更を行うために Policy オブジェクトへのハンドルが必要です。 Policy オブジェクトのハンドルを取得するには、LsaOpenPolicy を呼び出し、アクセスするシステムの名前と必要なアクセス許可のセットを指定します。
アプリケーションに必要なアクセス許可は、実行するアクションによって異なります。 各関数に必要なアクセス許可の詳細については、「 LSA ポリシー関数」でその関数の説明を参照してください。
LsaOpenPolicy の呼び出しが成功した場合は、指定されたシステムの Policy オブジェクトへのハンドルを返します。 その後、アプリケーションは後続の LSA Policy 関数呼び出しでこのハンドルを渡します。 アプリケーションでハンドルが不要になった場合は、 LsaClose を呼び出して解放する必要があります。
次の例は、 Policy オブジェクト ハンドルを開く方法を示しています。
#include <windows.h>
#define TARGET_SYSTEM_NAME L"mysystem"
LSA_HANDLE GetPolicyHandle()
{
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
WCHAR SystemName[] = TARGET_SYSTEM_NAME;
USHORT SystemNameLength;
LSA_UNICODE_STRING lusSystemName;
NTSTATUS ntsResult;
LSA_HANDLE lsahPolicyHandle;
// Object attributes are reserved, so initialize to zeros.
ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
//Initialize an LSA_UNICODE_STRING to the server name.
SystemNameLength = wcslen(SystemName);
lusSystemName.Buffer = SystemName;
lusSystemName.Length = SystemNameLength * sizeof(WCHAR);
lusSystemName.MaximumLength = (SystemNameLength+1) * sizeof(WCHAR);
// Get a handle to the Policy object.
ntsResult = LsaOpenPolicy(
&lusSystemName, //Name of the target system.
&ObjectAttributes, //Object attributes.
POLICY_ALL_ACCESS, //Desired access permissions.
&lsahPolicyHandle //Receives the policy handle.
);
if (ntsResult != STATUS_SUCCESS)
{
// An error occurred. Display it as a win32 error code.
wprintf(L"OpenPolicy returned %lu\n",
LsaNtStatusToWinError(ntsResult));
return NULL;
}
return lsahPolicyHandle;
}
前の例では、アプリケーションは特権POLICY_ALL_ACCESS要求 しました。 LsaOpenPolicy を呼び出すときにアプリケーションが要求するアクセス許可の詳細については、アプリケーションが Policy オブジェクト ハンドルを渡す関数の説明を参照してください。
信頼されたドメインの Policy オブジェクトへのハンドルを開くには、 LsaCreateTrustedDomainEx (ドメインとの新しい信頼関係を作成するには) を呼び出すか、 LsaOpenTrustedDomainByName (既存の信頼されたドメインにアクセスする) を呼び出します。 これらの両方の関数は、ポインターを LSA_HANDLEに設定し、後続の LSA ポリシー関数呼び出しで指定できます。 LsaOpenPolicy と同様に、信頼されたドメインの Policy オブジェクトへのハンドルが不要になったら、アプリケーションで LsaClose を呼び出す必要があります。