開啟原則物件句柄
大部分的 LSA 原則函式都需要 原則 物件的句柄,系統才能查詢或修改。 若要取得 原則 物件的句柄,請呼叫 LsaOpenPolicy,並指定您想要存取的系統名稱和所需的訪問許可權集。
應用程式所需的訪問許可權取決於其執行的動作。 如需每個函式所需權限的詳細資訊,請參閱 LSA 原則函式中的描述。
如果呼叫 LsaOpenPolicy 成功,它會傳回指定系統的 Policy 物件的控制代碼。 您的應用程式接著會在後續的 LSA 政策函式呼叫中傳遞此 handle。 當應用程式不再需要控制碼時,它應該呼叫 LsaClose 來釋放它。
下列範例示範如何開啟 原則 物件句柄。
#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 時應要求哪些許可權的詳細資訊,請參閱應用程式將傳遞 原則 物件句柄的函式描述。
若要開啟信任網域 原則 物件的句柄,請呼叫 LsaCreateTrustedDomainEx(以建立與網域的新信任關係),或呼叫 LsaOpenTrustedDomainByName(以存取現有的信任網域)。 這兩個函式都會設定 LSA_HANDLE的指標,然後您可以在後續的 LSA 策略函式呼叫中指定。 如同 LsaOpenPolicy,當應用程式不再需要信任網域 原則 物件的句柄時,應用程式應該呼叫 LsaClose。