如何判断我的进程是否以管理员身份运行?
-
21-08-2019 - |
题
我希望在进程以管理员身份运行时显示一些额外的 UI 元素,而不是在不以管理员身份运行时显示,类似于 Visual Studio 2008 在以管理员身份运行时在其标题栏中显示“管理员”的方式。我怎么知道?
解决方案
从技术上讲,如果您想查看该成员是否是本地管理员 帐户, ,那么你可以得到 安全标识符(SID) 当前用户通过 User
财产 于 WindowsIdentity
班级, ,像这样(静态 GetCurrent
方法 获取当前 Windows 用户):
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string sid = windowsIdentity.User.ToString();
这 User
属性返回用户的 SID 有许多针对不同组和用户的预定义值.
然后你会检查是否 SID具有以下模式,表明它是本地管理员帐户(这是众所周知的SID):
S-1-5-{其他SID部分}-500
或者,如果您不想解析字符串,可以使用 SecurityIdentifier
班级:
// Get the built-in administrator account.
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid,
null);
// Compare to the current user.
bool isBuiltInAdmin = (windowsIdentity.User == sid);
但是,我怀疑你的 真的 想知道当前用户是否是管理员的成员 团体 对于本地机器。您可以使用以下命令获取此 SID WellKnownSidType
的 BuiltinAdministratorsSid
:
// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
WellKnownSidType.BuiltinAdministratorsSid, null);
然后你可以检查 Groups
财产 于 WindowsIdentity
查看该用户是否是本地管理员组的成员,如下所示:
bool isLocalAdmin = windowsIdentity.Groups.
Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
Any(s => s == localAdminGroupSid);
其他提示
我认为这是一个很好的简单机制。
using System.Security.Principal;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
下面是一个一个衬里做到这一点。
using System.Security.Principal;
static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
我觉得重要的是要注意我有尝试使用上面WellKnownSidType.BuiltinAdministratorsSid每casperOne的答案的难度。按照 WellKnownSiDType MSDN ,BuiltinAdministratorsSid“表示该管理员帐户相匹配的SID。”所以,我希望casperOne的代码工作,并猜测它在某些环境中可能不会。不幸的是,它并没有在我的Windows 2003和.NET 2.0(遗留代码)。它实际上返回S-1-5-32-544其中,根据这篇文章是SID对于管理员基。因此,比较失败对我来说。我会做我自己的字符串比较的startswith“S-1-5-21”(即KB 243330指示“21”被列入即使上面提到的博客没有)和的endsWith“500”。