Как получить доменное имя 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.