加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何获取Windows域名?

发布时间:2020-12-16 07:53:08 所属栏目:百科 来源:网络整理
导读:如何获取机器的域名(如果机器实际上已加入域名)? 而且,当然,如果机器没有加入域,函数应该返回 null,或 一个空字符串,或 机器名称,或 “.” 笔记: NetGetJoinInformation Win32函数返回域的传统NetBIOS名称(例如AVATOPIA),而不是域的名称(例如avatopia.loca
如何获取机器的域名(如果机器实际上已加入域名)?

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

> 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.

> LookupAccountSid Win32函数返回域的传统NetBIOS名称(例如AVATOPIA);并返回登录用户的域,这可能与机器不同

更新一

我也尝试使用ADs对象绑定到域的IADs接口:

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

这种方法的问题是:

>您无法获取域名(仅可分辨名称)
>如果用户没有查询AD的权限,则不起作用
>如果用户不是活动目录中的有效用户,则不起作用
>它仅适用于Active Directory域

更新二:

只要清楚我想要的是:

>选择哪个单选按钮
> what’s in the (selected) box

奖金阅读

> How to get fully qualified domain name on windows in Delphi(用户域)
> Machine’s domain name in .NET?(来自.NET)

解决方法

干得好:
#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: %un",dw);
        return dw;
    }

    if (info->DomainNameDns == NULL)
    {
        wprintf(L"DomainNameDns is NULLn");
    }
    else
    {
        wprintf(L"DomainNameDns: %sn",info->DomainNameDns);
    }

    return 0;
}

任何使用DsRoleGetPrimaryDomainInformation生产用途的人都应该考虑在不再需要信息时调用DsRoleFreeMemory释放内存块(根据评论中的讨论).

该函数返回three different domain names,例如:

域名森林名称:例如stackoverflow.com
>域名DNS名称:例如stackoverflow.com
域名NetBIOS名称:例如堆栈溢出

如果机器未加入域,那么Forest和dns都是空白的,只有NetBios名称填写了工作组名称,例如:

>域名森林名称:null
>域名DNS名称:例如空值
域名NetBIOS名称:例如WORKGROUP

该函数还返回一个标志,指示机器是否连接到域:

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

或不:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读