Как вы программно определяете, является ли компьютер с Windows членом домена? - PullRequest
10 голосов
/ 15 октября 2008

Мне нужен способ определить, подключен ли компьютер, на котором запущена моя программа, к какому-либо домену. Неважно, к какому конкретному домену он относится, связан ли он с чем-либо. Я пишу в vc ++ против Win32 API.

Ответы [ 7 ]

11 голосов
/ 16 октября 2008

Прямо от Microsoft:

Как определить, является ли компьютер с Windows NT / Windows 2000 членом домена

Этот подход использует Windows API. Из реферата статьи:

В этой статье описывается, как определить, если компьютер под управлением Windows NT 4.0 или Windows 2000 является членом домена, является членом рабочей группы, или это отдельный компьютер с использованием локальной безопасности API авторизации.

В статье также приведен пример кода для небольшой программы, который выводит, является ли компьютер, на котором запущена программа, частью домена, частью рабочей группы или автономным компьютером.

3 голосов
/ 16 октября 2008

Я думаю, что NetServerEnum функция поможет вам в том, что вы хотите; Я бы попросил первичные контроллеры домена с константой SV_TYPE_DOMAIN_CTRL для параметра servertype . Если вы ничего не получили, значит, вы не в домене.

1 голос
/ 19 февраля 2016

Вот чертовски простой подход, который я не вижу упомянутым.

TCHAR UserDnsDomain[128] = { 0 }; 
DWORD Result = 0;

Result = GetEnvironmentVariable("USERDNSDOMAIN", UserDnsDomain, sizeof(UserDnsDomain));

if (Result == 0 || Result >= sizeof(UserDnsDomain) || GetLastError() == ERROR_ENVVAR_NOT_FOUND)
{
    return(FALSE); // Not logged in to a domain
}

Это основано на идее, что если пользователь, выполняющий этот код, в настоящее время не вошел в домен, то переменная среды USERDNSDOMAIN будет пустой или недоступной. Но есть некоторые предостережения, о которых вы должны подумать.

Плюсы:

  • Очень легко реализовать.
  • 99% надежности.

Минусы:

  • Может давать сбой или возвращать ложные результаты, если компьютер подключен к домену, но пользователь, выполняющий этот код, вошел на этот компьютер с локальной учетной записью.
  • Может давать сбой или возвращать ложные результаты, если компьютер подключен к домену, но сетевое подключение к контроллеру домена было недоступно во время входа в систему / пользователь вошел в систему с кэшированными учетными данными.
1 голос
/ 16 октября 2008

Код в образце MSDN немного устарел. Это функция, которую я придумал, которая работает.

bool ComputerBelongsToDomain()
{
    bool ret = false;

    LSA_OBJECT_ATTRIBUTES objectAttributes;
    LSA_HANDLE policyHandle;
    NTSTATUS status;
    PPOLICY_PRIMARY_DOMAIN_INFO info;

    // Object attributes are reserved, so initialize to zeros.
    ZeroMemory(&objectAttributes, sizeof(objectAttributes));

    status = LsaOpenPolicy(NULL, &objectAttributes, GENERIC_READ | POLICY_VIEW_LOCAL_INFORMATION, &policyHandle);
    if (!status)
    {
        status = LsaQueryInformationPolicy(policyHandle, PolicyPrimaryDomainInformation, (LPVOID*)&info);
        if (!status)
        {
            if (info->Sid)
                ret = true;

            LsaFreeMemory(info);
        }

        LsaClose(policyHandle);
    }

    return ret;
}
1 голос
/ 16 октября 2008

Вы можете проверить ключ реестра HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon для значения 'CachePrimaryDomain'.

0 голосов
/ 16 октября 2008

Избегайте LSA, который является неправильным методом. Вы должны использовать DS api (2 строки кода)

0 голосов
/ 16 октября 2008

как насчет названия компьютера?

edit: это был «ответ» дерьма из далека. То, что я имел в виду, это проверять форму domain\name в имени компьютера. Это, конечно, означает, что вы знаете имя домена, но это не решает проблему простого знания, находится ли компьютер в каком-либо домене.

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