다음을 통해 공유


신뢰할 수 있는 도메인 정보 관리

LSA 정책은 신뢰할 수 있는 도메인을 만들고, 열거하고, 삭제하고, 신뢰할 수 있는 도메인 정보를 설정하고 검색하는 데 사용할 수 있는 몇 가지 함수를 제공합니다.

신뢰할 수 있는 도메인 정보를 관리하려면 먼저 정책 개체 핸들 열기에 설명된 대로 애플리케이션 Policy 개체에 대한 핸들을 가져와야 합니다.

LsaEnumerateTrustedDomainsEx를 호출하여 신뢰할 수 있는 도메인을 열거할 수 있습니다.

신뢰할 수 있는 도메인에 대한 정보를 검색하려면 LsaQueryTrustedDomainInfo 또는 LsaQueryTrustedDomainInfoByName을 호출합니다. 두 함수 모두 동일한 정보를 반환합니다. 그러나 LsaQueryTrustedDomainInfo 는 SID로 신뢰할 수 있는 도메인을 식별하고 LsaQueryTrustedDomainInfoByName 은 신뢰할 수 있는 도메인을 이름으로 식별합니다.

신뢰할 수 있는 도메인에 대한 정보를 설정하려면 LsaSetTrustedDomainInformation 또는 LsaSetTrustedDomainInfoByName을 호출합니다. 쿼리 함수와 마찬가지로 LsaSetTrustedDomainInformation 은 SID로 신뢰할 수 있는 도메인을 식별하는 반면 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;
}