微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 如何获取Windows域名?

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

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

> 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: %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名称:例如堆栈溢出

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

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

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

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

或不:

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

原文地址:https://www.jb51.cc/c/115296.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐