在c#中如何判断进程是否有管理员权限
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;
 
namespace onitroad
{
	class IsElevated
	{
		static int Main(string[] args)
        {
            if (onitroad.UacHelper.IsProcessElevated)
            {
                return 0; // 有管理员权限
            }
            else
            {
                return 1; // 没有权限
            }

        }
	}
 
 
	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,
			TokenOroirn,
			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
			{
				RegistryKey uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false);
				bool 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))
					if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle))
					{
						throw new ApplicationException("Could not get process token.  Win32 Error Code: " + Marshal.GetLastWin32Error());
					}
 
					TOKEN_ELEVATION_TYPE elevationResult = TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault;
 
					int elevationResultSize = Marshal.SizeOf((int)elevationResult);
					uint returnedSize = 0;
					IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize);
 
					bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize);
					if (success)
					{
						elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr);
						bool isProcessAdmin = elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
						return isProcessAdmin;
					}
					else
					{
						throw new ApplicationException("Unable to determine the current elevation.");
					}
				}
				else
				{
					WindowsIdentity identity = WindowsIdentity.GetCurrent();
					WindowsPrincipal principal = new WindowsPrincipal(identity);
					bool result = principal.IsInRole(WindowsBuiltInRole.Administrator);
					return result;
				}
			}
		}
	}
}
日期:2020-04-11 22:50:23 来源:oir作者:oir