Поделиться через


Управление сведениями о доверенном домене

Политика LSA предоставляет несколько функций, которые можно использовать для создания, перечисления и удаления доверенных доменов, а также для задания и получения сведений о доверенном домене.

Прежде чем вы сможете управлять сведениями о доверенном домене, приложение должно получить дескриптор объекта Политики , как описано в разделе Открытие дескриптора объекта политики.

Вы можете перечислить доверенные домены, вызвав LsaEnumerateTrustedDomainsEx.

Чтобы получить сведения о доверенном домене, вызовите LsaQueryTrustedDomainInfo или LsaQueryTrustedDomainInfoByName. Обе функции возвращают одни и те же сведения; однако LsaQueryTrustedDomainInfo определяет доверенный домен по идентификатору безопасности, а LsaQueryTrustedDomainInfoByName определяет доверенный домен по имени.

Чтобы задать сведения для доверенного домена, вызовите LsaSetTrustedDomainInformation или LsaSetTrustedDomainInfoByName. Как и в случае с функциями запросов, LsaSetTrustedDomainInformation определяет доверенный домен по идентификатору безопасности, а LsaSetTrustedDomainInfoByName определяет доверенный домен по имени.

Приложение может отозвать отношение доверия для доверенного домена, вызвав LsaDeleteTrustedDomain.

В следующем примере перечисляются доверенные домены для локальной системы.

#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;
}