Compartir a través de


Abrir un identificador de objeto de directiva

La mayoría de las funciones de directiva de LSA requieren un identificador para el objeto Policy para que el sistema consulte o modifique. Para obtener un identificador de un objeto Policy , llame a LsaOpenPolicy y especifique el nombre del sistema al que desea acceder y el conjunto de permisos de acceso necesarios.

Los permisos de acceso necesarios para la aplicación dependen de las acciones que realiza. Para obtener más información sobre los permisos necesarios para cada función, consulte la descripción de esa función en funciones de directiva de LSA.

Si la llamada a LsaOpenPolicy se realiza correctamente, devuelve un identificador al objeto Policy del sistema especificado. A continuación, la aplicación pasa este identificador en las llamadas posteriores a la función LSA Policy. Cuando la aplicación ya no necesite el identificador, debe llamar a LsaClose para liberarlo.

En el ejemplo siguiente se muestra cómo abrir un 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;
}

En el ejemplo anterior, la aplicación solicitó privilegios POLICY_ALL_ACCESS. Para obtener más información sobre qué permisos debe solicitar la aplicación al llamar a LsaOpenPolicy, consulte las descripciones de las funciones a las que la aplicación pasará el identificador de objeto Policy .

Para abrir un identificador en el objeto Policy de un dominio de confianza, llame a LsaCreateTrustedDomainEx (para crear una nueva relación de confianza con un dominio) o llame a LsaOpenTrustedDomainByName (para acceder a un dominio de confianza existente). Ambas funciones establecen un puntero en un LSA_HANDLE, que luego se pueden especificar en llamadas posteriores a la función LSA Policy. Al igual que con LsaOpenPolicy, la aplicación debe llamar a LsaClose cuando ya no necesite el identificador para el objeto Policy del dominio de confianza.