Condividi tramite


Gestione delle informazioni di dominio attendibili

Criteri LSA offre diverse funzioni che è possibile usare per creare, enumerare ed eliminare domini attendibili e per impostare e recuperare informazioni di dominio attendibili.

Prima di poter gestire le informazioni di dominio attendibili, l'applicazione deve ottenere un handle per un oggetto Policy , come illustrato in Apertura di un handle oggetto Criteri.

È possibile enumerare i domini attendibili chiamando LsaEnumerateTrustedDomainsEx.

Per recuperare informazioni su un dominio attendibile, chiamare LsaQueryTrustedDomainInfo o LsaQueryTrustedDomainInfoByName. Entrambe le funzioni restituiscono le stesse informazioni; Tuttavia, LsaQueryTrustedDomainInfo identifica il dominio attendibile da SID e LsaQueryTrustedDomainInfoByName identifica il dominio attendibile in base al nome.

Per impostare le informazioni per un dominio attendibile, chiamare LsaSetTrustedDomainInformation o LsaSetTrustedDomainInfoByName. Come per le funzioni di query, LsaSetTrustedDomainInformation identifica il dominio attendibile tramite SID, mentre LsaSetTrustedDomainInfoByName identifica il dominio attendibile in base al nome.

L'applicazione può revocare una relazione di trust per un dominio attendibile chiamando LsaDeleteTrustedDomain.

Nell'esempio seguente vengono enumerati i domini attendibili per il sistema locale.

#include <windows.h>

void EnumerateTrusts(LSA_HANDLE PolicyHandle)
{
  LSA_ENUMERATION_HANDLE hEnum=0; 
  PLSA_TRUST_INFORMATION TrustInfo = NULL;
  ULONG ulReturned = 0;               
  NTSTATUS Status = 0;
  ULONG i;
  WCHAR StringBuffer[256];

  // Enumerate the trusted domains until there are no more to return.
  do 
  {
    Status = LsaEnumerateTrustedDomains(
       PolicyHandle,         // an open policy handle
       &hEnum,               // enumeration tracker
       (PVOID*)&TrustInfo,   // buffer to receive data
       32000,                // recommended buffer size
       &ulReturned           // number of items returned in TrustInfo
    );

    // Check the return status for errors.
    if((Status != STATUS_SUCCESS) &&
       (Status != STATUS_MORE_ENTRIES) &&
     (Status != STATUS_NO_MORE_ENTRIES))
      {
        // Handle the error.
        wprintf(L"Error occurred enumerating domains %lu\n",
        LsaNtStatusToWinError(Status));
        return;
      } 

      wprintf(L"Status %lu\n", LsaNtStatusToWinError(Status));
      // Process the trusted domain information.
      for (i=0;i<ulReturned; i++) 
      {
        // LSA_Unicode strings might not be null-terminated.
        if(TrustInfo[i].Name.Length < 256)
        {
            wcsncpy_s(StringBuffer,
                256,
                TrustInfo[i].Name.Buffer,
                TrustInfo[i].Name.Length
            );
            // Guarantee that StringBuffer is null-terminated.
            StringBuffer[TrustInfo[i].Name.Length] = NULL; 
        }
        else
        {
            fprintf(stderr, "Name too long for string buffer.\n");
            exit(1);
        }
        
        wprintf(L"Enum Trusted Domain - %ws ", StringBuffer);
      }
      // Free the buffer.
      if (TrustInfo != NULL) 
      {
        LsaFreeMemory(TrustInfo);
        TrustInfo = NULL;
      }
    } while (Status != STATUS_NO_MORE_ENTRIES);
    return;
}