c – 如何获取Windows域名?

前端之家收集整理的这篇文章主要介绍了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:不是域的成员的服务器

原文链接:/c/115296.html

猜你在找的C&C++相关文章