gpt4 book ai didi

c++ - 如何获取 Windows 域名?

转载 作者:IT老高 更新时间:2023-10-28 21:45:37 29 4
gpt4 key购买 nike

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

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

  • null,或
  • 空字符串,或
  • 机器的名称,或
  • "."

注意事项:

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

  • USERDOMAIN 环境变量返回登录用户的域,可以与机器不同;并且还返回域的旧 NetBIOS 名称(例如 AVATOPIA)

  • USERDNSDOMAIN环境变量返回登录用户的域名,可以与 native 不同

Microsoft 有一篇知识库文章 How to retrieve current user and domain names on Windows NT, Windows 2000, or Windows XP ,这依赖于获取用户的安全 token 并调用 LookupAccountSid。

  • LookupAccountSid Win32 函数返回域的旧 NetBIOS 名称(例如 AVATOPIA);并且还返回登录用户的域,可以与机器不同

更新一

我也尝试过使用 ADs 对象绑定(bind)到域的 IADs 接口(interface):

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

这种方法的问题在于:

  • 您无法获取域名(只有专有名称)
  • 如果用户没有查询AD的权限则不起作用
  • 如果用户不是事件目录中的有效用户,则它不起作用
  • 它仅适用于 Active Directory 域

更新二:

只是为了清楚我想要的是:

enter image description here

阅读奖励

最佳答案

给你:

#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
  • 域名 DNS 名称:例如stackoverflow.com
  • 域 NetBIOS 名称:例如堆栈溢出

如果机器没有加入域,那么 Forestdns 都是空白的,只有 NetBios 名称填写工作组的名称,例如:

  • 域林名称:null
  • 域名 DNS 名称:例如null
  • 域 NetBIOS 名称:例如工作组

该函数还返回一个标志,表明机器是否加入了域:

  • DsRole_RoleMemberWorkstation:属于域成员的工作站
  • DsRole_RoleMemberServer:属于域成员的服务器
  • DsRole_RolePrimaryDomainController:主域 Controller
  • DsRole_RoleBackupDomainController:备份域 Controller

或不:

  • DsRole_RoleStandaloneWorkstation:不是域成员的工作站
  • DsRole_RoleStandaloneServer:不是域成员的服务器

关于c++ - 如何获取 Windows 域名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9792411/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com