如何检查用户是域用户还是本地用户?

时间:2015-06-16 17:43:35

标签: windows security winapi

我希望能够检查运行当前线程的用户是否:

  • 域用户
  • 机器的本地用户

有一些cavaets:

  • 我不知道(或关心)该机器是否已加入域
  • 因为登录用户的域可能来自与计算机域不同的域
  • 并且因为该进程正在运行的用户的域可以来自登录的用户或计算机域
  • 并且因为线程正在运行的用户的域可以来自进程,登录或计算机域

换句话说,我想:

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
  • NameDisplay 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
  • NameDisplay
  • NameUniqueId
  • NameCanonical
  • NameUserPrincipal
  • NameCanonicalEx
  • NameServicePrincipal
  • NameDnsDomain

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
  • :例如HYDROGENSTACKOVERFLOW

1 个答案:

答案 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;
}