精准确定管理员及权限提升
提供的代码片段准确地识别了管理员状态,但缺乏区分标准管理员权限和提升权限的能力。 此增强功能解决了该限制。
该解决方案涉及一种确定海拔状态的精细方法:
改进的IsProcessElevated
方法:
此增强方法利用 GetTokenInformation
函数直接确定进程提升级别,并考虑用户帐户控制 (UAC) 设置:
<code class="language-csharp">public static bool IsProcessElevated { get { // Check UAC status if (UacHelper.IsUacEnabled) { // Obtain process token IntPtr tokenHandle; if (!OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_READ, out tokenHandle)) { throw new ApplicationException($"Failed to retrieve process token. Win32 Error Code: {Marshal.GetLastWin32Error()}"); } // Retrieve elevation type 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); return elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; } else { throw new ApplicationException("Elevation status determination failed."); } } else { // Fallback to standard administrator check if UAC is disabled WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } } }</code>
此方法可以稳健地处理启用 UAC 和禁用 UAC 的场景,从而可靠地确定提升的权限。
以上是如何可靠地确定进程是否正在以提升的权限运行?的详细内容。更多信息请关注PHP中文网其他相关文章!