我想在进程以管理员身份运行时显示一些额外的 UI 元素,而不是在以管理员身份运行时显示一些额外的 UI 元素,类似于 Visual Studio 2008 在以管理员身份运行时在其标题栏中显示“管理员”的方式。我怎么知道?
5 回答
从技术上讲,如果要查看成员是否为本地管理员帐户,则可以通过类上的属性获取当前用户的安全标识符(SID),如下所示(静态方法获取当前 Windows 用户):User
WindowsIdentity
GetCurrent
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);
但是,我怀疑您真正想知道的是当前用户是否是本地计算机管理员组的成员。WellKnownSidType
您可以使用of获取此 SID 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);
我觉得根据上面 casperOne 的回答,我在尝试使用 WellKnownSidType.BuiltinAdministratorsSid 时遇到的困难很重要。根据WellKnownSiDType MSDN,BuiltinAdministratorsSid “表示与管理员帐户匹配的 SID”。所以我希望 casperOne 的代码可以工作,并且猜测它可能在某些环境中可以工作。不幸的是,它在我的带有 .NET 2.0(遗留代码)的 Windows 2003 上没有。它实际上返回了 S-1-5-32-544,根据这篇文章,它是管理员组的 sid 。因此,比较对我来说失败了。我将不得不对以“S-1-5-21”开头的字符串进行自己的比较(即 kb 243330 表示“21”
我使用简单的 try catch 语句在“C:\Windows\”文件夹中创建一个随机文件。如果出错,则应用程序正在以正常权限运行,否则以管理员权限运行。
try
{
File.Create(string.Format(@"C:\Windows\{0}.txt", new Guid()), 0, FileOptions.DeleteOnClose);
// Do as admin
}
catch
{
// Do as default
}