gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:05:20 27 4
gpt4 key购买 nike

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

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

  • 有一些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函数,该函数允许您以不同的格式返回用户名:
  • 名称未知:(无)
  • 名称完全合格的DN :CN=John Smith,OU=Stackoverflow Users,DC=stackoverflow,DC=com
  • NameSamCompatible :STACKOVERFLOW\jsmith
  • 名称显示:John
  • NameUniqueId :{C1AF1DE6-363D-42A7-BB0D-9D1EDDC44B81}
  • 名称规范:stackoverflow.com/Stackoverfow Users/John Smith
  • NameUserPrincipal :jsmith@stackoverflow.com
  • 名称CanonicalEx :stackoverflow.com/Stackoverflow Users/John Smith
  • NameServicePrincipal :(无)
  • NameDnsDomain :STACKOVERFLOW.COM\jsmith


  • 名称未知:
  • 名称完全合格的DN :
  • NameSamCompatible :HYDROGEN\john
  • 名称显示:
  • 名称唯一身份:
  • 名称规范:
  • NameUserPrincipal :
  • 名称CanonicalEx :
  • NameServicePrincipal :
  • NameDnsDomain :

  • KB11154:如何检索当前用户和域名

    Microsoft有一个知识库文章:

    How to retrieve current user and domain names on Windows NT, Windows 2000, or Windows XP



    它涉及:
  • OpenThreadToken
  • OpenProcessToken(如果没有线程 token )
  • GetTokenInformation-获取TOKEN_USER
  • LookupAccountSid-从TOKEN_USER中获取用户名和域名

  • 最后返回:
  • 用户名:例如jsmith
  • :例如HYDROGENSTACKOVERFLOW
  • 最佳答案

    下午好!

    我研究了针对此问题发布的其他一些解决方案,但是大多数解决方案都没有考虑您列出的警告。大多数相关解决方案均来自以下帖子:

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

    关于windows - 如何检查用户是域用户还是本地用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30874566/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com