我希望在进程以管理员身份运行时显示一些额外的 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 WellKnownSidTypeBuiltinAdministratorsSid:

// 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”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top