用C#写个小工具,现在的win11都权限要求很高,即使关闭UAC,在涉及应用进程方法,还是需要管理员权限的,下面三种方法可以实现:
方法一:修改应用程序清单(推荐,永久生效)
这是 Windows 程序官方的权限声明方式,程序内置管理员权限标记,运行时系统自动触发 UAC 提权,是最通用的做法。
操作步骤
-
在 Visual Studio 的解决方案资源管理器里,右键你的项目
WindowInfoSpy→ 添加 → 新建项 -
在模板里搜索并选择 应用程序清单文件(文件名默认
app.manifest),点击「添加」 -
打开刚添加的
app.manifest文件,找到下面这行:<requestedExecutionLevel level="asInvoker" uiAccess="false" /> -
修改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> -
保存文件,重新编译项目即可。
效果说明
-
编译后的 exe 图标右下角会出现小盾牌标识
-
双击运行时会自动弹出 UAC 权限确认框,确认后直接以管理员身份启动
-
所有系统进程的窗口路径、句柄信息都能正常获取,不会再提示「权限不足」
调试注意
开启这个设置后,在 Visual Studio 里按 F5 调试时,必须先以管理员身份启动 Visual Studio 本身,否则会提示「无法启动调试」。
方法二:exe 属性 / 快捷方式设置(无需改代码)
如果不想修改程序源码,可以直接给 exe 文件或快捷方式单独设置:
-
右键编译好的
WindowInfoSpy.exe→ 属性 → 兼容性选项卡 -
勾选 以管理员身份运行此程序 → 确定保存
-
也可以给快捷方式设置:右键快捷方式→属性→快捷方式→高级→勾选「用管理员身份运行」
缺点:每个文件 / 快捷方式都要单独设置,复制到别的电脑还要重新配置。
方法三:代码自动判断提权(可选)
在程序启动代码里检测当前是否是管理员身份,如果不是就自动重启自己并申请管理员权限。适合「大部分功能普通权限可用,只在需要时提权」的场景。
在 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提权,就保持普通模式运行
}
}
}
总结建议
你的窗口属性查看工具经常需要读取系统级进程信息,直接用方法一修改清单文件最省事,一次编译永久生效,和你之前用的易语言工具管理员运行效果完全一致。