大多数 LSA Policy 函数都需要 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 Policy 函数调用中指定该指针。 与 LsaOpenPolicy 一样,应用程序在不再需要受信任域的 Policy 对象的句柄时应调用 LsaClose。