打开策略对象句柄

大多数 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