관리자 역할을 넘어서: 권한 상승 상태 결정
원래 관리자 상태를 감지하는 데 사용된 코드는 관리자로 실행 중이지만 권한을 승격시키지 않는 등의 상황을 고려하지 않았기 때문에 권한 승격을 식별하는 능력이 제한되었습니다. 이를 통해 관리자는 적절한 인증 없이 민감한 작업을 쉽게 수행할 수 있습니다.
이 문제를 해결하려면 관리자 상태와 실제 권한 상승 수준을 확인하는 보다 포괄적인 접근 방식이 필요합니다. 다음 코드 예제는 솔루션을 제공합니다.
<code class="language-csharp">using Microsoft.Win32; using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Security.Principal; public static class UacHelper { // 用于确定UAC状态的UAC注册表项和值 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 { TokenElevationType = 9 } // 可能的提升级别 public enum TOKEN_ELEVATION_TYPE { TokenElevationTypeDefault = 1, TokenElevationTypeFull, TokenElevationTypeLimited } // 检查UAC是否启用 public static bool IsUacEnabled { get { using (var uacKey = Registry.LocalMachine.OpenSubKey(uacRegistryKey, false)) { return uacKey.GetValue(uacRegistryValue).Equals(1); } } } // 检查当前进程是否已提升 public static bool IsProcessElevated { get { if (IsUacEnabled) { // 当前进程令牌的句柄 IntPtr tokenHandle; // 尝试以读取访问权限打开进程令牌 if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle)) { throw new ApplicationException("无法获取进程令牌。Win32错误代码:" + Marshal.GetLastWin32Error()); } // 分配内存以存储提升信息 int elevationResultSize = Marshal.SizeOf((int)TOKEN_ELEVATION_TYPE.TokenElevationTypeDefault); IntPtr elevationTypePtr = Marshal.AllocHGlobal(elevationResultSize); // 从令牌中检索提升类型 uint returnedSize; bool success = GetTokenInformation(tokenHandle, TOKEN_INFORMATION_CLASS.TokenElevationType, elevationTypePtr, (uint)elevationResultSize, out returnedSize); // 检查操作是否成功 if (success) { // 从已分配的内存中读取提升类型 var elevationResult = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(elevationTypePtr); // 判断进程是否具有完全提升权限 return elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; } else { throw new ApplicationException("无法确定当前提升级别。"); } } else { // UAC未启用,依靠WindowsPrincipal检查管理员角色 WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } } }</code>
사용법:
이 코드를 사용하려면 IsProcessElevated
속성을 호출하세요.
<code class="language-csharp">bool isElevated = UacHelper.IsProcessElevated;</code>
프로세스가 전체 권한으로 승격된 경우 true
를 반환하고, 그렇지 않은 경우 false
를 반환합니다. 또한 IsUacEnabled
속성을 사용하여 시스템에서 UAC가 활성화되어 있는지 확인할 수 있습니다.
위 내용은 Windows에서 프로세스의 권한이 상승했는지 정확하게 확인하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!