> 백엔드 개발 > 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿