Управление сведениями о доверенном домене
Политика 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;
}