而且,当然,如果机器没有加入域,函数应该返回
> 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:不是域的成员的服务器