Last active
June 27, 2018 07:25
-
-
Save polarstars/1866f8474a44f0399beeeadc43a107af to your computer and use it in GitHub Desktop.
程序中判断是否有管理员权限 #C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Win32; | |
using System; | |
using System.Collections.Generic; | |
using System.Diagnostics; | |
using System.Linq; | |
using System.Runtime.InteropServices; | |
using System.Security.Principal; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace ToolsHelp | |
{ | |
public static class UacHelper | |
{ | |
private const string uacRegistryKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"; | |
private const string uacRegistryValue = "EnableLUA"; | |
private static uint STANDARD_RIGHTS_READ = 0x00020000; | |
private static uint TOKEN_QUERY = 0x0008; | |
private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY); | |
[DllImport("advapi32.dll", SetLastError = true)] | |
[return: MarshalAs(UnmanagedType.Bool)] | |
static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle); | |
[DllImport("advapi32.dll", SetLastError = true)] | |
public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength); | |
public enum TOKEN_INFORMATION_CLASS | |
{ | |
TokenUser = 1, | |
TokenGroups, | |
TokenPrivileges, | |
TokenOwner, | |
TokenPrimaryGroup, | |
TokenDefaultDacl, | |
TokenSource, | |
TokenType, | |
TokenImpersonationLevel, | |
TokenStatistics, | |
TokenRestrictedSids, | |
TokenSessionId, | |
TokenGroupsAndPrivileges, | |
TokenSessionReference, | |
TokenSandBoxInert, | |
TokenAuditPolicy, | |
TokenOrigin, | |
TokenElevationType, | |
TokenLinkedToken, | |
TokenElevation, | |
TokenHasRestrictions, | |
TokenAccessInformation, | |
TokenVirtualizationAllowed, | |
TokenVirtualizationEnabled, | |
TokenIntegrityLevel, | |
TokenUIAccess, | |
TokenMandatoryPolicy, | |
TokenLogonSid, | |
MaxTokenInfoClass | |
} | |
public enum TOKEN_ELEVATION_TYPE | |
{ | |
TokenElevationTypeDefault = 1, | |
TokenElevationTypeFull, | |
TokenElevationTypeLimited | |
} | |
public static bool IsUacEnabled | |
{ | |
get | |
{ | |
var uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false); | |
var result = uacKey.GetValue(uacRegistryValue).Equals(1); | |
return result; | |
} | |
} | |
public static bool IsProcessElevated | |
{ | |
get | |
{ | |
if (IsUacEnabled) | |
{ | |
IntPtr tokenHandle; | |
if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle)) | |
{ | |
throw new ApplicationException("Could not get process token. Win32 Error Code: " + Marshal.GetLastWin32Error()); | |
} | |
var elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault; | |
var elevationResultSize = Marshal.SizeOf((int)elevationResult); | |
uint returnedSize = 0; | |
var elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize); | |
var success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, | |
out returnedSize); | |
if (success) | |
{ | |
elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr); | |
var isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; | |
return isProcessAdmin; | |
} | |
throw new ApplicationException("Unable to determine the current elevation."); | |
} | |
var identity = WindowsIdentity.GetCurrent(); | |
var principal = new WindowsPrincipal(identity); | |
var result = principal.IsInRole(WindowsBuiltInRole.Administrator); | |
return result; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment