如何判断我的进程是否以管理员身份运行?

时间:2009-02-03 22:47:25

标签: c# .net process privileges

我希望在以管理员身份运行流程时显示一些额外的UI元素,而不是在不运行时显示一些UI元素,类似于Visual Studio 2008在以管理员身份运行时在其标题栏中显示“管理员”的方式。我该怎么说?

5 个答案:

答案 0 :(得分:34)

从技术上讲,如果您想查看该成员是否为本地管理员帐户,那么您可以通过security identifier (SID)上的User property获取当前用户的WindowsIdentity class {3}},就像这样(静态GetCurrent method获取当前的Windows用户):

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

string sid = windowsIdentity.User.ToString();

User属性返回has a number of predefined values for various groups and users

的用户的SID

然后你会查看是否the SID has the following pattern, indicating it is the local administrator account (which is a well-known 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);

但是,我怀疑您真正想知道的是当前用户是否是本地计算机的管理员的成员。您可以使用BuiltinAdministratorsSid的{​​{3}}获取此SID:

// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
    WellKnownSidType.BuiltinAdministratorsSid, null);

然后,您可以检查用户的WindowsIdentity上的WellKnownSidType,看看该用户是否是本地管理员组的成员,如下所示:

bool isLocalAdmin = windowsIdentity.Groups.
    Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
    Any(s => s == localAdminGroupSid);

答案 1 :(得分:19)

我认为这是一个很好的简单机制。

using System.Security.Principal;

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

答案 2 :(得分:3)

这是一个单行班。

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);

答案 3 :(得分:0)

我觉得重要的是要注意我尝试使用WellKnownSidType.BuiltinAdministratorsSid每个casperOne上面的答案时遇到的困难。根据{{​​3}},BuiltinAdministratorsSid“表示与管理员帐户匹配的SID。”所以我希望casperOne的代码可以工作,并且猜测它可能在某些环境中有效。不幸的是,它没有在我的带有.NET 2.0的Windows 2003(遗留代码)上。它实际上返回了S-1-5-32-544,根据WellKnownSiDType MSDN,它是管理员的sid。因此,比较失败了。我将不得不为“S-1-5-21”开头进行自己的字符串比较(即使上面引用的博客没有,kb 243330表示包括“21”)并以“500”结尾。

答案 4 :(得分:-1)

我使用简单的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
        }