Partager via


Gestion des informations de stratégie

Le LSA fournit des fonctions que les administrateurs peuvent utiliser pour interroger et définir des informations de stratégie globale pour l’ordinateur local et le domaine.

Avant de pouvoir gérer les informations de stratégie, votre application doit obtenir un handle pour l’objet Policy local, comme illustré dans Ouverture d’un handle d’objet de stratégie. Ce handle est requis par les fonctions qui gèrent les informations de stratégie.

Pour récupérer des informations sur la stratégie de sécurité locale, appelez LsaQueryInformationPolicy. Pour définir une stratégie de sécurité locale, appelez LsaSetInformationPolicy. La description de l’énumération POLICY_INFORMATION_CLASS détaille les types d’informations de stratégie qui peuvent être interrogés ou définis.

L’exemple suivant montre comment obtenir les informations de domaine d’un compte système, en fonction d’un handle à l’objet Policy du système.

#include <windows.h>

BOOL GetAccountDomainInfo(LSA_HANDLE PolicyHandle)
{
  NTSTATUS ntsResult = STATUS_SUCCESS;
  PPOLICY_ACCOUNT_DOMAIN_INFO pPADInfo = NULL;
  PWCHAR name = NULL;
  UINT nameSize;
  
  ntsResult = LsaQueryInformationPolicy(
    PolicyHandle,                   // Open handle to a Policy object.
    PolicyAccountDomainInformation, // The information to get.
    (PVOID *)&pPADInfo              // Storage for the information.
  );

  if (ntsResult == STATUS_SUCCESS)
  {  
    // There is no guarantee that the LSA_UNICODE_STRING buffer
    // is null-terminated, so copy the name to a buffer that is.
    nameSize =  pPADInfo->DomainName.Length + 1 * sizeof(WCHAR);
    name = (WCHAR *) LocalAlloc(LPTR, nameSize);
    if (!name)
    {
        wprintf(L"Failed LocalAlloc\n");
        exit(1);
    }
    wcsncpy_s(name, nameSize, pPADInfo->DomainName.Buffer,
        pPADInfo->DomainName.Length);
    wprintf(L"The account domain name is %ws\n", name);
    LocalFree(name);
    if (STATUS_SUCCESS != LsaFreeMemory(pPADInfo))
        wprintf(L"LsaFreeMemory error\n");
  }
  else
  {
    // Show the corresponding win32 error code.
    wprintf(
        L"Error obtaining account domain information - (win32) %lu\n",
        LsaNtStatusToWinError(ntsResult));
  }

  return !ntsResult;
}