用C#写个小工具,现在的win11都权限要求很高,即使关闭UAC,在涉及应用进程方法,还是需要管理员权限的,下面三种方法可以实现:

方法一:修改应用程序清单(推荐,永久生效)

这是 Windows 程序官方的权限声明方式,程序内置管理员权限标记,运行时系统自动触发 UAC 提权,是最通用的做法。

操作步骤

  1. 在 Visual Studio 的解决方案资源管理器里,右键你的项目 WindowInfoSpy添加新建项

  2. 在模板里搜索并选择 应用程序清单文件(文件名默认 app.manifest),点击「添加」

  3. 打开刚添加的 app.manifest 文件,找到下面这行:

     <requestedExecutionLevel level="asInvoker" uiAccess="false" />
  4. 修改为:

     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
  5. 保存文件,重新编译项目即可。

效果说明

  • 编译后的 exe 图标右下角会出现小盾牌标识

  • 双击运行时会自动弹出 UAC 权限确认框,确认后直接以管理员身份启动

  • 所有系统进程的窗口路径、句柄信息都能正常获取,不会再提示「权限不足」

调试注意

开启这个设置后,在 Visual Studio 里按 F5 调试时,必须先以管理员身份启动 Visual Studio 本身,否则会提示「无法启动调试」。


方法二:exe 属性 / 快捷方式设置(无需改代码)

如果不想修改程序源码,可以直接给 exe 文件或快捷方式单独设置:

  1. 右键编译好的 WindowInfoSpy.exe属性兼容性选项卡

  2. 勾选 以管理员身份运行此程序 → 确定保存

  3. 也可以给快捷方式设置:右键快捷方式→属性快捷方式高级→勾选「用管理员身份运行」

缺点:每个文件 / 快捷方式都要单独设置,复制到别的电脑还要重新配置。


方法三:代码自动判断提权(可选)

在程序启动代码里检测当前是否是管理员身份,如果不是就自动重启自己并申请管理员权限。适合「大部分功能普通权限可用,只在需要时提权」的场景。

Form1_Load 中添加这段逻辑即可:

using System.Security.Principal;
using System.Diagnostics;

private void Form1_Load(object sender, EventArgs e)
{
    // 检测当前是否为管理员身份
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);

    if (!isAdmin)
    {
        // 重启程序,请求管理员权限
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = Application.ExecutablePath;
        startInfo.UseShellExecute = true;
        startInfo.Verb = "runas"; // 关键:触发管理员提权
        try
        {
            Process.Start(startInfo);
            Application.Exit(); // 关闭当前普通权限的实例
        }
        catch
        {
            // 用户拒绝了UAC提权,就保持普通模式运行
        }
    }
}

总结建议

你的窗口属性查看工具经常需要读取系统级进程信息,直接用方法一修改清单文件最省事,一次编译永久生效,和你之前用的易语言工具管理员运行效果完全一致。