Как получить доменное имя Windows?

Как я могу получить доменное имя машины (если машина фактически соединена с доменом)?

И, конечно, если машина не присоединена к домену, функция должна возвращать

  • null, или
  • пустая строка или
  • имя машины, или
  • "."

Примечания:

  • NetGetJoinInformation Функция Win32 возвращает устаревшее имя NetBIOS для домена (например, AVATOPIA), а не имя домена (например, avatopia.local)

  • переменная среды USERDOMAIN возвращает домен зарегистрированного пользователя, который может отличаться от машины; а также возвращает устаревшее имя NetBIOS для домена (например, AVATOPIA)

  • переменная среды USERDNSDOMAIN возвращает имя домена зарегистрированного пользователя, который может отличаться от машины

Microsoft имеет статью базы знаний Как получить текущие имена пользователей и доменов в Windows NT, Windows 2000 или Windows XP, которые полагаются на получение токена безопасности пользователя и вызов LookupAccountSid.

  • Функция LookupAccountSid Win32 возвращает устаревшее имя NetBIOS для домена (например, AVATOPIA); а также возвращает домен зарегистрированного пользователя, который может отличаться от машины.

Обновить один

Я также попытался использовать объект ADs для привязки к интерфейсу IADs домена:

IADs domain;
ADsGetObject("LDAP://rootDES", IDs, out domain);

Проблема с этим подходом заключается в следующем:

  • вы не можете получить доменное имя (только различающееся имя)
  • он не работает, если у пользователя нет разрешений на запрос AD
  • он не работает, если пользователь не является допустимым пользователем в активном каталоге
  • он работает только для доменов Active Directory

Обновить два:

Просто, чтобы быть ясным, что я хочу:

enter image description here

Чтение бонусов

Ответ 1

Здесь вы идете:

#include <Windows.h>
#include <DSRole.h>

#pragma comment(lib, "netapi32.lib")

#include <stdio.h>

int main(int argc, char ** argv)
{
    DSROLE_PRIMARY_DOMAIN_INFO_BASIC * info;
    DWORD dw;

    dw = DsRoleGetPrimaryDomainInformation(NULL,
                                           DsRolePrimaryDomainInfoBasic,
                                           (PBYTE *)&info);
    if (dw != ERROR_SUCCESS)
    {
        wprintf(L"DsRoleGetPrimaryDomainInformation: %u\n", dw);
        return dw;
    }

    if (info->DomainNameDns == NULL)
    {
        wprintf(L"DomainNameDns is NULL\n");
    }
    else
    {
        wprintf(L"DomainNameDns: %s\n", info->DomainNameDns);
    }

    return 0;
}

Любой, кто использует DsRoleGetPrimaryDomainInformation в процессе использования, должен рассмотреть возможность вызова DsRoleFreeMemory, чтобы освободить блок памяти, когда информация больше не нужна (согласно обсуждению в комментариях).

Функция возвращает три разных имени домена, например:

  • Имя леса леса. stackoverflow.com
  • DNS-имя домена. stackoverflow.com
  • Имя домена NetBIOS: например. STACKOVERFLOW

Если устройство не подключено к домену, то оба леса и dns пусты, и только имя NetBios заполняется именем рабочей группы, например:

  • Имя леса леса: null
  • DNS-имя домена. null
  • Имя домена NetBIOS: например. WORKGROUP

Функция также возвращает флаг, указывающий, подключен ли компьютер к домену:

  • DsRole_RoleMemberWorkstation: рабочая станция, являющаяся членом домена
  • DsRole_RoleMemberServer: сервер, являющийся членом домена
  • DsRole_RolePrimaryDomainController: основной контроллер домена
  • DsRole_RoleBackupDomainController: резервный контроллер домена

или нет:

  • DsRole_RoleStandaloneWorkstation: рабочая станция, не являющаяся членом домена
  • DsRole_RoleStandaloneServer: сервер, который не является членом домена

Ответ 2

Используя GetComputerNameEx, вы можете получить имя своего компьютера и имя домена.

Пример:

TCHAR local[100];
DWORD hstSize = sizeof(local);
GetComputerNameEx(ComputerNameDnsDomain, local, &hstSize);

Примечание: ComputerNameDnsDomain дает имя домена, а ComputerNameNetBIOS - имя локальной рабочей группы (компьютера).

Ответ 3

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