我希望能够检查运行当前线程的用户是否:
有一些cavaets:
换句话说,我想:
public static Boolean IsLocalUser()
{
//code here
}
以下是无关的奖励信息。它没有增加任何问题,但仅仅是为了使问题更长。
使用NetGetJoinInformation
我可以使用NetGetJoinInformation
检查本地计算机是否已加入域:
NetGetJoinInformation(null, ref domain, ref joinStatus);
返回:
domain
包含工作组的名称(例如WORKGROUP
)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
功能,允许您以不同的格式返回用户名:
CN=John Smith,OU=Stackoverflow Users,DC=stackoverflow,DC=com
STACKOVERFLOW\jsmith
John
{C1AF1DE6-363D-42A7-BB0D-9D1EDDC44B81}
stackoverflow.com/Stackoverfow Users/John Smith
jsmith@stackoverflow.com
stackoverflow.com/Stackoverflow Users/John Smith
STACKOVERFLOW.COM\jsmith
也
HYDROGEN\john
KB11154:如何检索当前用户和域名
Microsoft有一篇知识库文章:
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
答案 0 :(得分:1)
下午好!
我研究了针对此问题发布的其他一些解决方案,但其中大多数都没有考虑您列出的警告。大多数相关解决方案来自以下帖子:
Check if user is a Domain User or Local User
在这些解决方案中,以下似乎与您提出的建议最为吻合:
bool IsLocalUser(string accountName)
{
var domainContext = new PrincipalContext(ContextType.Machine);
return Principal.FindByIdentity(domainContext, accountName) != null;
}