Ouverture d’un handle d’objet de stratégie

La plupart des fonctions de stratégie LSA nécessitent un handle dans l’objet Policy pour que le système interroge ou modifie. Pour obtenir un handle pour un objet Policy , appelez LsaOpenPolicy et spécifiez le nom du système auquel vous souhaitez accéder et l’ensemble des autorisations d’accès requises.

Les autorisations d’accès requises pour votre application dépendent des actions qu’elle effectue. Pour plus d’informations sur les autorisations requises pour chaque fonction, consultez la description de cette fonction dans Fonctions de stratégie LSA.

Si l’appel à LsaOpenPolicy réussit, il retourne un handle à l’objet Policy pour le système spécifié. Votre application transmet ensuite ce handle dans les appels de fonction LSA Policy suivants. Lorsque votre application n’a plus besoin du handle, elle doit appeler LsaClose pour la libérer.

L’exemple suivant montre comment ouvrir un handle d’objet 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;
}

Dans l’exemple précédent, l’application a demandé POLICY_ALL_ACCESS privilèges. Pour plus d’informations sur les autorisations que votre application doit demander lors de l’appel de LsaOpenPolicy, consultez les descriptions des fonctions auxquelles votre application passera le handle de l’objet Policy .

Pour ouvrir un handle à l’objet Policy d’un domaine approuvé, appelez LsaCreateTrustedDomainEx (pour créer une relation d’approbation avec un domaine) ou appelez LsaOpenTrustedDomainByName (pour accéder à un domaine approuvé existant). Ces deux fonctions définissent un pointeur vers un LSA_HANDLE, que vous pouvez ensuite spécifier dans les appels de fonction LSA Policy suivants. Comme avec LsaOpenPolicy, votre application doit appeler LsaClose lorsqu’elle n’a plus besoin du handle de l’objet Policy du domaine approuvé.