Compartilhar via


Abrindo um identificador de objeto de política

A maioria das funções de política LSA exige um identificador para o objeto Policy para o sistema consultar ou modificar. Para obter um identificador para um objeto Policy , chame LsaOpenPolicy e especifique o nome do sistema que você deseja acessar e o conjunto de permissões de acesso necessário.

As permissões de acesso necessárias para seu aplicativo dependem das ações que ele executa. Para obter detalhes sobre as permissões necessárias para cada função, consulte a descrição dessa função no LSA Policy Functions.

Se a chamada para LsaOpenPolicy for bem-sucedida, ela retornará um identificador para o objeto Policy do sistema especificado. Em seguida, seu aplicativo passa esse identificador em chamadas de função de política LSA subsequentes. Quando o aplicativo não precisar mais do identificador, ele deverá chamar LsaClose para liberá-lo.

O exemplo a seguir mostra como abrir um identificador de objeto 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;
}

No exemplo anterior, o aplicativo solicitou privilégios de POLICY_ALL_ACCESS. Para obter detalhes sobre quais permissões seu aplicativo deve solicitar ao chamar LsaOpenPolicy, consulte as descrições das funções para as quais seu aplicativo passará o identificador do objeto Policy .

Para abrir um identificador para o objeto Policy de um domínio confiável, chame LsaCreateTrustedDomainEx (para criar uma nova relação de confiança com um domínio) ou chame LsaOpenTrustedDomainByName (para acessar um domínio confiável existente). Ambas as funções definem um ponteiro para um LSA_HANDLE, que você pode especificar em chamadas de função de política LSA subsequentes. Assim como acontece com LsaOpenPolicy, seu aplicativo deve chamar LsaClose quando ele não precisar mais do identificador para o objeto Policy do domínio confiável.