Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menentukan Dengan Tepat jika Proses Mempunyai Keistimewaan Ditingkatkan dalam Windows?

Bagaimanakah Saya Boleh Menentukan Dengan Tepat jika Proses Mempunyai Keistimewaan Ditingkatkan dalam Windows?

Barbara Streisand
Lepaskan: 2025-01-13 07:02:43
asal
576 orang telah melayarinya

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

Melebihi Peranan Admin: Tentukan Status Peningkatan Keistimewaan

Kod yang asalnya digunakan untuk mengesan status pentadbir terhad dalam keupayaannya untuk mengenal pasti peningkatan keistimewaan kerana ia tidak mengambil kira situasi seperti menjalankan sebagai pentadbir tetapi tidak meningkatkan keistimewaan. Ini memudahkan pentadbir melakukan operasi sensitif tanpa kebenaran yang sewajarnya.

Untuk menyelesaikan isu ini, pendekatan yang lebih komprehensif untuk menentukan status pentadbir dan tahap ketinggian sebenar diperlukan. Contoh kod berikut menyediakan penyelesaian:

<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>
Salin selepas log masuk

Penggunaan:

Untuk menggunakan kod ini, hanya panggil atribut IsProcessElevated:

<code class="language-csharp">bool isElevated = UacHelper.IsProcessElevated;</code>
Salin selepas log masuk

Pulangan true jika proses itu dinaikkan dengan keistimewaan penuh, false sebaliknya. Selain itu, anda boleh menyemak sama ada UAC didayakan pada sistem anda menggunakan atribut IsUacEnabled.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Dengan Tepat jika Proses Mempunyai Keistimewaan Ditingkatkan dalam Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan