신뢰할 수 있는 도메인 정보 관리
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;
}