首頁 > 後端開發 > C++ > Windows下如何準確判斷進程是否提權?

Windows下如何準確判斷進程是否提權?

Barbara Streisand
發布: 2025-01-13 07:02:43
原創
576 人瀏覽過

How Can I Accurately Determine if a Process Has Elevated Privileges in Windows?

超越管理者角色:決定權限提升狀態

最初用於偵測管理員狀態的程式碼在識別權限提升方面能力有限,因為它沒有考慮例如以管理員身分執行但未提升權限的情況。這使得管理員容易在未經適當授權的情況下執行敏感操作。

為了解決這個問題,需要一種更全面的方法來確定管理員狀態和實際的提升等級。以下程式碼範例提供了一個解決方案:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板