首頁 >後端開發 >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