打开策略对象句柄

大多数 LSA Policy 函数都需要处理 策略 对象,以便系统查询或修改。 若要获取 策略 对象的句柄,请调用 LsaOpenPolicy 并指定要访问的系统的名称和所需的访问权限集。

应用程序所需的访问权限取决于其执行的操作。 有关每个函数所需的权限的详细信息,请参阅 LSA Policy Functions 中该函数的说明。

如果对 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 对象句柄的函数的说明。

若要打开受信任域 的策略 对象的句柄,请调用 LsaCreateTrustedDomainEx (以创建新的与域) 的信任关系,或调用 LsaOpenTrustedDomainByName (以访问现有受信任域) 。 这两个函数都设置指向 LSA_HANDLE的指针,然后可以在后续 LSA Policy 函数调用中指定该指针。 与 LsaOpenPolicy 一样,当应用程序不再需要受信任的域的策略对象的句柄时,应用程序应调用 LsaClose