Поделиться через


Открытие дескриптора объекта политики

Большинство функций Политики LSA требуют дескриптора для объекта политики , чтобы запросить или изменить его. Чтобы получить дескриптор объекта политики, вызовите LsaOpenPolicy и укажите имя системы, к которой требуется доступ, и набор необходимых разрешений доступа.

Разрешения доступа, необходимые для приложения, зависят от выполняемых действий. Дополнительные сведения о разрешениях, необходимых для каждой функции, см. в описании этой функции в LSA Policy Functions.

Если вызов LsaOpenPolicy выполнен успешно, он возвращает дескриптор объекту Policy для указанной системы. Затем ваше приложение передает этот дескриптор в последующих вызовах функций политики LSA. Если приложению больше не нужен дескриптор, оно должно вызывать 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 Policy. Как и LsaOpenPolicy, приложение должно вызывать LsaClose, если он больше не нуждается в дескрипторе объекта политики доверенного домена.