Лучший способ получить подключенное сетевое доменное имя в Windows - PullRequest
0 голосов
/ 04 ноября 2019

Я хотел бы выяснить, подключена ли локальная система Windows к сетевому домену (вместо рабочей группы), и если да, прочитать имя домена.

Я нашел эти функции Windows API для достижения этой цели. :

  GetEnvironmentVariable('USERDNSDOMAIN')
  NetGetJoinInformation
  NetServerGetInfo
  NetWkstaGetInfo
  LookupAccountSid

Есть ли между ними какие-либо преимущества или недостатки? (быстрее, надежнее, точнее, ...)

Какой из них вы бы порекомендовали и почему?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

самое прямое и эффективное здесь - звоните 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

0 голосов
/ 04 ноября 2019

LookupAccountSid больше ориентирован на поиск sid, NetServerGetInfo на поиск информации о сервере. Так что ни один из них не относится к вам.

Доменное имя получает от NetGetJoinInformation, а NetWkstaGetInfo соответствует USERDOMAIN вместо USERDNSDOMAIN, в зависимости от того, какое имя домена вы хотите.

GetEnvironmentVariable - это функция, которая просто получает значение переменной и может быть изменена с помощью SetEnvironmentVariable в любое время (даже если мы обычно этого не делаем), поэтому я не рекомендую ее.

Для успешного выполнения функции NetGetJoinInformation специальное членство в группе не требуется.

И оно более чисто, чем NetWkstaGetInfo (согласно вашему требованию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...