Administración de información de dominio de confianza
La directiva de LSA proporciona varias funciones que puede usar para crear, enumerar y eliminar dominios de confianza y para establecer y recuperar información de dominio de confianza.
Para poder administrar la información de dominio de confianza, la aplicación debe obtener un identificador para un objeto Policy , como se explica en Apertura de un identificador de objeto de directiva.
Puede enumerar los dominios de confianza llamando a LsaEnumerateTrustedDomainsEx.
Para recuperar información sobre un dominio de confianza, llame a LsaQueryTrustedDomainInfo o LsaQueryTrustedDomainInfoByName. Ambas funciones devuelven la misma información; sin embargo, LsaQueryTrustedDomainInfo identifica el dominio de confianza por SID y LsaQueryTrustedDomainInfoByName identifica el dominio de confianza por nombre.
Para establecer información para un dominio de confianza, llame a LsaSetTrustedDomainInformation o LsaSetTrustedDomainInfoByName. Al igual que con las funciones de consulta, LsaSetTrustedDomainInformation identifica el dominio de confianza por SID, mientras que LsaSetTrustedDomainInfoByName identifica el dominio de confianza por nombre.
La aplicación puede revocar una relación de confianza para un dominio de confianza mediante una llamada a LsaDeleteTrustedDomain.
En el ejemplo siguiente se enumeran los dominios de confianza para el 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;
}