開啟原則物件控制碼

大部分的 LSA 原則函式都需要 原則物件的句 柄,系統才能查詢或修改。 若要取得 Policy 物件的控制碼,請呼叫 LsaOpenPolicy 並指定您想要存取的系統名稱,以及所需的一組存取權限。

應用程式所需的存取權限取決於其執行的動作。 如需每個函式所需許可權的詳細資訊,請參閱 LSA 原則函式中該函式的描述。

如果 呼叫 LsaOpenPolicy 成功,它會傳回指定系統 之 Policy 物件的控制碼。 您的應用程式接著會在後續的 LSA 原則函式呼叫中傳遞此控制碼。 當應用程式不再需要控制碼時,它應該呼叫 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,當應用程式不再需要受信任網域原則物件的控制碼時,應該呼叫LsaClose