Gerenciando informações de domínio confiável
A política LSA fornece várias funções que você pode usar para criar, enumerar e excluir domínios confiáveis e para definir e recuperar informações de domínio confiáveis.
Antes de gerenciar informações de domínio confiáveis, seu aplicativo deve obter um identificador para um objeto Policy , conforme explicado em Abrir um Identificador de Objeto de Política.
Você pode enumerar os domínios confiáveis chamando LsaEnumerateTrustedDomainsEx.
Para recuperar informações sobre um domínio confiável, chame LsaQueryTrustedDomainInfo ou LsaQueryTrustedDomainInfoByName. Ambas as funções retornam as mesmas informações; no entanto, LsaQueryTrustedDomainInfo identifica o domínio confiável por SID e LsaQueryTrustedDomainInfoByName identifica o domínio confiável por nome.
Para definir informações para um domínio confiável, chame LsaSetTrustedDomainInformation ou LsaSetTrustedDomainInfoByName. Assim como acontece com as funções de consulta, LsaSetTrustedDomainInformation identifica o domínio confiável por SID, enquanto LsaSetTrustedDomainInfoByName identifica o domínio confiável por nome.
Seu aplicativo pode revogar uma relação de confiança para um domínio confiável chamando LsaDeleteTrustedDomain.
O exemplo a seguir enumera os domínios confiáveis para o sistema local.
#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;
}