我已阅读相关的Stack Overflow问题并尝试了以下代码:
WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;
即使我手动确认当前用户是本地内置管理员组的成员,它也不会返回true。
我错过了什么?
感谢。
答案 0 :(得分: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秒。
答案 1 :(得分:1)
刚刚找到其他方法来检查用户是否为admin,而不是以admin身份运行应用程序:
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,但代码已得到纠正。