Как получить доменное имя Windows? - PullRequest
13 голосов
/ 20 марта 2012

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

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

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

Примечания :

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

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

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

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

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

Update One

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

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

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

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

Обновление два :

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

enter image description here

Бонус Чтение

Ответы [ 3 ]

13 голосов
/ 21 марта 2012

Вот, пожалуйста:

#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

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

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

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

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

или нет:

  • DsRole_RoleStandaloneWorkstation: рабочая станция, которая не является членом домена
  • DsRole_RoleStandaloneServer: сервер, который не является членом домена
5 голосов
/ 27 ноября 2012

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

Пример:

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

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

0 голосов
/ 20 марта 2012

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

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