首页 >后端开发 >C++ >如何可靠地确定进程是否正在以提升的权限运行?

如何可靠地确定进程是否正在以提升的权限运行?

DDD
DDD原创
2025-01-13 08:19:43922浏览

How Can I Reliably Determine if a Process is Running with Elevated Privileges?

精准确定管理员及权限提升

提供的代码片段准确地识别了管理员状态,但缺乏区分标准管理员权限和提升权限的能力。 此增强功能解决了该限制。

该解决方案涉及一种确定海拔状态的精细方法:

改进的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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn