2017-06-12 44 views
1

我看了相关的堆栈溢出的问题,并尝试了下面的代码:如何检查当前用户是管理员组的C#

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

它没有返回true,即使我已经手动证实,目前用户是本地内置管理员组的成员。

我缺少什么?

谢谢。

+0

做你的代码有不同的输出,当你的“当前用户”运行这段代码并运行它为管理员? –

+3

您必须以管理员身份运行代码。如果您正在运行Visual Studio,请首先以管理员身份启动VS. –

+0

啊,没有意识到它必须以管理员身份运行。我在Winform应用程序中使用它,并希望能够确定当前用户是否是管理员用户。回到绘图板。谢谢。 –

回答

1

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

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秒。

+0

肯定。它的工作原理,谢谢 – Alexan

0

刚刚找到其他的方式来检查,如果用户是管理员,不运行应用程序作为管理员:

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,但代码修正了一下。

相关问题