【发布时间】:2015-06-16 17:43:35
【问题描述】:
我希望能够检查运行当前线程的用户是否是:
- 域用户
- 机器的本地用户
有一些注意事项:
- 我不知道(或关心)这台机器是否已加入域
- 因为登录用户的域可能与机器域不同
- 并且因为进程正在运行的用户域可能来自登录的用户或计算机域
- 并且因为线程正在运行的用户域可能来自进程、登录或机器域
换句话说,我想要:
public static Boolean IsLocalUser()
{
//code here
}
研究工作
接下来是无关的奖金信息。它没有给问题增加任何内容,只是为了使问题更长。
使用NetGetJoinInformation检查机器是否加入域
我可以使用NetGetJoinInformation 来检查本地机器是否加入了域:
NetGetJoinInformation(null, ref domain, ref joinStatus);
返回:
- NetSetupUnknownStatus:状态未知。
- NetSetupUnjoined:计算机未加入。
- NetSetupWorkgroupName:计算机已加入工作组。
-
domain包含工作组的名称(例如WORKGROUP)
-
- NetSetupDomainName:计算机已加入域。
-
domain包含域的旧 NetBIOS 名称(例如STACKOVERFLOW)
-
使用DsRoleGetPrimaryDomainInformation检查机器是否加入域
我可以使用DsRoleGetPrimaryDomainInformation 来检查本地机器是否加入了域:
DsRoleGetPrimaryDomainInformation(null,
DsRolePrimaryDomainInfoBasic,
DSROLE_PRIMARY_DOMAIN_INFO_BASIC);
返回一个DSROLE_PRIMARY_DOMAIN_INFO_BASIC 结构:
-
MachineRole-
DsRole_RoleStandaloneWorkstation: 机器未加入域 -
DsRole_RoleStandaloneServer: 机器未加入域 -
DsRole_RoleMemberWorkstation:机器已加入域 -
DsRole_RoleMemberServer:机器已加入域 -
DsRole_RoleBackupDomainController:机器已加入域 -
DsRole_RolePrimaryDomainController: 机器已加入域
-
-
DomainNameDns:返回 DNS 域名(例如stackoverflow.com)(可选) -
DomainNameFlat:返回旧的 NetBIOS 域名(例如STACKOVERFLOW)
但是,同样,当用户不是域用户或用户来自不同域时,告诉我机器加入的域的名称也无济于事
使用GetUserName获取当前用户的名字
Windows 确实提供了GetUserName 函数:
GetUserName(buffer, Length(buffer));
返回用户名,例如lsimpson
使用GetUserNameEx获取当前用户的名字
Windows 确实提供了一个GetUserNameEx 函数,它允许您以不同的格式返回用户名:
- NameUnknown:(无)
-
NameFullyQualifiedDN:
CN=John Smith,OU=Stackoverflow Users,DC=stackoverflow,DC=com -
NameSamCompatible:
STACKOVERFLOW\jsmith -
姓名显示:
John -
NameUniqueId:
{C1AF1DE6-363D-42A7-BB0D-9D1EDDC44B81} -
NameCanonical:
stackoverflow.com/Stackoverfow Users/John Smith -
NameUserPrincipal:
jsmith@stackoverflow.com -
NameCanonicalEx:
stackoverflow.com/Stackoverflow Users/John Smith - NameServicePrincipal:(无)
-
NameDnsDomain:
STACKOVERFLOW.COM\jsmith
还有
- NameUnknown:
- NameFullyQualifiedDN:
-
NameSamCompatible:
HYDROGEN\john - 名称显示:
- NameUniqueId:
- NameCanonical:
- NameUserPrincipal:
- NameCanonicalEx:
- NameServicePrincipal:
- NameDnsDomain:
KB11154:如何检索当前用户和域名
微软有一篇知识库文章:
How to retrieve current user and domain names on Windows NT, Windows 2000, or Windows XP
涉及:
OpenThreadToken-
OpenProcessToken(如果没有线程令牌) -
GetTokenInformation- 得到TOKEN_USER -
LookupAccountSid- 从TOKEN_USER获取用户名和域名
最后它返回:
-
用户名:例如
jsmith -
域:例如
HYDROGEN,STACKOVERFLOW
【问题讨论】:
-
无缘无故投反对票?不错的 Stackoverflow!
-
你好,我也需要实现这样的功能。你找到解决办法了吗?谢谢!