Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取Windows域名?_C++_Windows_Dns - Fatal编程技术网

C++ 如何获取Windows域名?

C++ 如何获取Windows域名?,c++,windows,dns,C++,Windows,Dns,如何获取计算机的域名(如果计算机实际上已加入域) 当然,如果机器没有加入域,函数应该返回 null,或 空字符串,或 机器的名称,或 “ 注释: Win32函数返回域的传统NetBIOS名称(例如AVATOPIA),而不是域的名称(例如AVATOPIA.local) USERDOMAIN环境变量返回登录用户的域,该域可能不同于机器;并且还返回域的传统NetBIOS名称(例如,AVATOPIA) USERDNSDOMAIN环境变量返回登录用户的域名,该域名可能与计算机不同 Microsof

如何获取计算机的域名(如果计算机实际上已加入域)

当然,如果机器没有加入域,函数应该返回

  • null
    ,或
  • 空字符串,或
  • 机器的名称,或
注释

  • Win32函数返回域的传统NetBIOS名称(例如
    AVATOPIA
    ),而不是域的名称(例如
    AVATOPIA.local

  • USERDOMAIN
    环境变量返回登录用户的域,该域可能不同于机器;并且还返回域的传统NetBIOS名称(例如,
    AVATOPIA

  • USERDNSDOMAIN
    环境变量返回登录用户的域名,该域名可能与计算机不同

Microsoft有一篇知识库文章,它依赖于获取用户的安全令牌并调用LookupAccountSid

  • LookupAccountSid Win32函数返回域的旧版NetBIOS名称(例如,
    AVATOPIA
    );并且还返回登录用户的域,该域可能与计算机不同
更新一 我还尝试使用ADs对象绑定到域的
IADs
接口:

IADs domain;
ADsGetObject("LDAP://rootDES", IDs, out domain);
这种方法的问题在于:

  • 您无法获取域名(仅可分辨名称)
  • 如果用户没有查询广告的权限,则此操作无效
  • 如果用户不是active directory中的有效用户,则此选项无效
  • 它仅适用于Active Directory域
更新两个

我想说清楚的是:

  • 选择了哪个单选按钮
额外阅读
  • (用户域)
  • (来自.NET)

您可以使用类通过WMI获取域名。该链接包含指向有关如何与WMI交互的示例的其他链接。

这里是:

#包括
#包括
#pragma注释(lib,“netapi32.lib”)
#包括
int main(int argc,字符**argv)
{
DSROLE\u PRIMARY\u DOMAIN\u INFO\u BASIC*INFO;
德沃德;
dw=DsRoleGetPrimaryDomainInformation(NULL,
DsRolePrimaryDomainInfoBasic,
(PBYTE*)和信息);
if(dw!=错误\u成功)
{
wprintf(L“DsRoleGetPrimaryDomainInformation:%u\n”,dw);
返回数据仓库;
}
如果(信息->域名DNS==NULL)
{
wprintf(L“域名DNS为空\n”);
}
其他的
{
wprintf(L“域名DNS:%s\n”,信息->域名DNS);
}
返回0;
}
< P>生产中使用的任何人都应该考虑在不再需要信息时调用内存块(如评论中的讨论)。 函数返回,例如:

  • 域名林名称:例如
    stackoverflow.com
  • 域名域名:例如
    stackoverflow.com
  • 域NetBIOS名称:例如
    堆栈溢出
如果计算机未加入域,则林和dns都为空,只有NetBios名称填写了工作组的名称,例如:

  • 域名林名称
    null
  • 域名域名:例如
    null
  • 域NetBIOS名称:例如
    工作组
该函数还返回一个标志,指示机器是否已加入域:

  • DsRole\u rolemberworkstation
    :作为域成员的工作站
  • DsRole\u rolemberserver
    :作为域成员的服务器
  • DsRole\u RolePrimaryDomainController
    :主域控制器
  • DsRole\u RoleBackupDomainController
    :备份域控制器
或否:

  • DsRole\u RoleStandaloneWorkstation
    :不是域成员的工作站
  • DsRole\u RoleStandaloneServer
    :不是域成员的服务器
使用您可以获得您的计算机名和域名

例如:

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

注释:给出域名和<代码> Computer NAMENETBIOS < /Computer >给出本地工作组(计算机)名称。< /P>您使用哪种语言来获取它?@ TPAKSU本机代码,因此您可以用C/C++、Delphi、C语言调用p/援引、汇编等。(这是一种迂回的说法,表示我不是从公共语言运行时或Java运行时内部调用它,也没有访问.NET Framework类库或Java类库的权限)我不清楚为什么您引用的引用不充分?我知道您希望从本机代码执行此操作,但是.NET中的

System.DirectoryServices.ActiveDirectory.Domain
是否返回所需信息?@MarkRansom您引用的是哪一个引用,查询用户域的引用,来自.NET的引用,还是返回NetBIOS名称的查询?查询
select*from Win32\u NTDomain
似乎需要15秒才能返回;而且它在Windows 2000上不工作。WMI速度慢且不可靠。最好使用本机API GetComputerNameEx()正如@Sanju Monu所建议的。Windows 2000中也存在GetComputerNameEx。作为记录,我没有在非域计算机上测试过它。但是如果它表现不好,只需首先使用NetGetJoinInformation检查您是否在域中。它在非域加入的计算机、AD域加入的计算机、Windows 2000和非c的计算机上工作连接到网络。我想我们有一个赢家。我只需要弄清楚“dns域名”和“森林域名”之间的区别——哪一个是我的域名()@wishmesh:经过考虑后,我决定回滚您的编辑。调用DsRol