如何获取机器的域名(如果机器实际上已加入域名)?
当然,如果机器未加入域,则函数应返回
null
或"."
备注:
NetGetJoinInformation
Win32函数返回域的旧NetBIOS名称(例如AVATOPIA
),而不是域名(例如avatopia.local
)
USERDOMAIN
环境变量返回登录用户的域,该域可以与计算机不同;并返回域的旧NetBIOS名称(例如AVATOPIA
)
USERDNSDOMAIN
环境变量返回登录用户的域名,该域名可以与计算机不同
Microsoft有一篇知识库文章How to retrieve current user and domain names on Windows NT, Windows 2000, or Windows XP,它依赖于获取用户的安全令牌并调用LookupAccountSid。
AVATOPIA
);并且还返回登录用户的域,该域可以与计算机不同我也尝试使用ADs对象绑定到域的IADs
接口:
IADs domain;
ADsGetObject("LDAP://rootDES", IDs, out domain);
这种方法的问题是:
更新两个:
要清楚我想要的是:
答案 0 :(得分:13)
你走了:
#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
释放内存块(根据评论中的讨论)。
该函数返回three different domain names,例如:
stackoverflow.com
stackoverflow.com
STACKOVERFLOW
如果计算机未加入域,则 Forest 和 dns 都是空白的,只有NetBios名称填充了工作组的名称,例如:< / p>
null
null
WORKGROUP
该函数还返回一个标志,指示机器是否已加入域:
DsRole_RoleMemberWorkstation
:作为域成员的工作站DsRole_RoleMemberServer
:属于域DsRole_RolePrimaryDomainController
:主域控制器DsRole_RoleBackupDomainController
:备份域控制器与否:
DsRole_RoleStandaloneWorkstation
:不是域成员的工作站DsRole_RoleStandaloneServer
:不是域成员的服务器答案 1 :(得分:5)
使用GetComputerNameEx
,您可以获取计算机名称和域名。
示例:
TCHAR local[100];
DWORD hstSize = sizeof(local);
GetComputerNameEx(ComputerNameDnsDomain, local, &hstSize);
注意:ComputerNameDnsDomain
提供域名,ComputerNameNetBIOS
提供本地工作组(计算机)名称。
答案 2 :(得分:0)
您可以使用Win32_NTDomain类通过WMI获取域名。该链接包含有关如何与WMI交互的示例的其他链接。