самое прямое и эффективное здесь - звоните LsaQueryInformationPolicy
с PolicyDnsDomainInformation . на выходе вы получили заполненную структуру POLICY_DNS_DOMAIN_INFO
. здесь будут имя и DNS-имя основного домена. а также он SID
Если компьютер, связанный с объектом Policy, не является членом домена, все элементы структуры, кроме Name, имеют значение NULL или ноль.
#include <Ntsecapi.h>
NTSTATUS PrintDomainName()
{
LSA_HANDLE PolicyHandle;
static LSA_OBJECT_ATTRIBUTES oa = { sizeof(oa) };
NTSTATUS status = LsaOpenPolicy(0, &oa, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle);
if (LSA_SUCCESS(status))
{
PPOLICY_DNS_DOMAIN_INFO ppddi;
if (LSA_SUCCESS(status = LsaQueryInformationPolicy(PolicyHandle, PolicyDnsDomainInformation, (void**)&ppddi)))
{
if (ppddi->Sid)
{
DbgPrint("DnsDomainName: %wZ\n", &ppddi->DnsDomainName);
}
else
{
DbgPrint("%wZ: not a member of a domain\n", &ppddi->Name);
}
LsaFreeMemory(ppddi);
}
LsaClose(PolicyHandle);
}
return status;
}
NetGetJoinInformation
внутренне делает то же самое - запрашивает PolicyDnsDomainInformation , но делает это не в вашем, а в удаленном процессе ( svchost.exe -k networkservice -p -s LanmanWorkstation - LanmanWorkstation и многие другие звонки. поэтому он менее эффективен, но и меньше исходного кода для вызова этого API