How can I tell if my process is running as Administrator?

后端 未结 5 998

I would like to display some extra UI elements when the process is being run as Administrator as opposed to when it isn\'t, similar to how Visual Studio 2008 displays \'Admi

相关标签:
5条回答
  • 2020-11-29 07:39

    I felt it important to note the difficulty I had with attempting to use WellKnownSidType.BuiltinAdministratorsSid per casperOne's answer above. According to the WellKnownSiDType MSDN, BuiltinAdministratorsSid "Indicates a SID that matches the administrator account." So I would expect casperOne's code to work, and guess it likely does in some environments. Unfortunately, it didn't on my Windows 2003 with .NET 2.0 (legacy code). It actually returned S-1-5-32-544 which, according to this article is the sid for the Administrators group. Thus, the comparison fails for me. I will have to do my own string comparison for startswith "S-1-5-21" (that kb 243330 indicates the "21" is included even though the blog referenced above does not) and endswith "500".

    0 讨论(0)
  • 2020-11-29 07:52

    I think this is a good simple mechanism.

    using System.Security.Principal;
    
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    
    0 讨论(0)
  • 2020-11-29 07:58

    Technically, if you want to see if the member is the local administrator account, then you can get the security identifier (SID) of the current user through the User property on the WindowsIdentity class, like so (the static GetCurrent method gets the current Windows user):

    WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
    
    string sid = windowsIdentity.User.ToString();
    

    The User property returns the SID of the user which has a number of predefined values for various groups and users.

    Then you would check to see if the SID has the following pattern, indicating it is the local administrator account (which is a well-known SID):

    S-1-5-{other SID parts}-500

    Or, if you don't want to parse strings, you can use the SecurityIdentifier class:

    // Get the built-in administrator account.
    var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, 
        null);
    
    // Compare to the current user.
    bool isBuiltInAdmin = (windowsIdentity.User == sid);
    

    However, I suspect that what you really want to know is if the current user is a member of the administrators group for the local machine. You can get this SID using the WellKnownSidType of BuiltinAdministratorsSid:

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

    Then you can check the Groups property on the WindowsIdentity of the user to see if that user is a member of the local admin group, like so:

    bool isLocalAdmin = windowsIdentity.Groups.
        Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
        Any(s => s == localAdminGroupSid);
    
    0 讨论(0)
  • 2020-11-29 08:01

    I use simple try catch statement to create a random file in "C:\Windows\" folder. If it errors out the app is running with normal privileges otherwise it is running as admin privileges.

            try
            {
                File.Create(string.Format(@"C:\Windows\{0}.txt", new Guid()), 0, FileOptions.DeleteOnClose);
                // Do as admin
            }
            catch
            {
                // Do as default
            }
    
    0 讨论(0)
  • 2020-11-29 08:05

    Here's a one liner to do it.

    using System.Security.Principal;
    
    static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
    
    0 讨论(0)
提交回复
热议问题