【问题标题】:how to check if current user is in admin group c#如何检查当前用户是否在管理员组c#
【发布时间】:2017-06-12 19:17:37
【问题描述】:

我已阅读相关的 Stack Overflow 问题并尝试了以下代码:

WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;

即使我手动确认当前用户是本地内置管理员组的成员,它也不会返回 true。

我错过了什么?

谢谢。

【问题讨论】:

  • 当您的“当前用户”运行此代码并以管理员身份运行时,您的代码是否有不同的输出?
  • 您必须以管理员身份运行代码。如果您通过 Visual Studio 运行,请先以管理员身份启动 VS。
  • 啊,没有意识到它必须以管理员身份运行。我在一个 winform 应用程序中使用它,并希望能够确定当前用户是否是管理员用户。回到绘图板。谢谢。
  • @RufusL,是否可以检查当前用户是否具有应用程序的管理员权限,在无管理员模式下运行?
  • 我相信是这样,让我在下面发布一个答案,你可以试试

标签: c# .net


【解决方案1】:

刚刚找到其他方法来检查用户是否为管理员,而不是以管理员身份运行应用程序:

private static bool  IsAdmin()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            if (identity != null)
            {
                WindowsPrincipal principal = new WindowsPrincipal(identity);
                List<Claim> list = new List<Claim>(principal.UserClaims);
                Claim c = list.Find(p => p.Value.Contains("S-1-5-32-544"));
                if (c != null)
                    return true;
            }
            return false;
        }

感谢this answer,但代码稍作修正。

【讨论】:

  • 这是我对这个问题找到的第一个合理(和快速代码)的答案。我在网上找到的所有其他答案都很慢或不适用于 UAC(或检查当前进程是否已提升)或无法正常工作。但是,您可以使用 var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null) 然后使用 sid.Value,而不是使用硬编码的“S-1-5-32-544”。
  • 或者作为稍微改进的版本private static bool IsAdmin() { var identity = WindowsIdentity.GetCurrent(); if (identity != null) { var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); var principal = new WindowsPrincipal(identity); return principal.UserClaims.Any(x =&gt; x.Value.Contains(sid.Value)); } return false; }
【解决方案2】:

您上面的代码似乎仅在以管理员身份运行时才有效,但是您可以通过执行类似于以下代码的操作来查询用户是否属于本地管理员组(不以管理员身份运行)。但是请注意,组名是硬编码的,所以我想如果你想在不同语言的操作系统上运行它,你需要做一些本地化工作。

using (var pc = new PrincipalContext(ContextType.Domain, Environment.UserDomainName))
{
    using (var up = UserPrincipal.FindByIdentity(pc, WindowsIdentity.GetCurrent().Name))
    {
        return up.GetAuthorizationGroups().Any(group => group.Name == "Administrators");
    }
}

请注意,您还可以通过在第二个 using 块中执行此操作来获取用户所属的所有组的列表:

var allGroups = up.GetAuthorizationGroups();

但这会慢得多,具体取决于他们所属的组数。比如我在 638 个组中,运行它需要 15 秒。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2014-05-01
    • 2012-12-26
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多