如何让 .NET 应用程序始终以管理员身份运行?(并且不抓狂)
嗨,同行!如果你曾经编写过用于操作注册表、安装 Windows 服务的工具,或者只是尝试将文件保存到 C:\\Program Files,你肯定遇到过这种情况:应用程序崩溃并显示“Access Denied”错误,用户耸耸肩,而你则挠头。熟悉吗?欢迎来到 UAC(用户帐户控制) 的世界,以及为管理员权限而进行的永恒斗争。
今天,我们将解析 Stack Overflow 上最热门的问题(是的,就是那个有数千次浏览的问题):“如何强制我的 .NET 应用程序以管理员身份运行?”。我们不仅仅是复制答案,我们将理解其工作原理,并用 C# 编写漂亮的代码。开始吧!
为什么不能直接运行?UAC 的魔力
从 Vista 开始,Windows 默认不信任应用程序。即使你以“管理员”身份登录,你的进程也会获得一个带有过滤权限的令牌。这是出于安全考虑:防止病毒轻易改写系统文件。
当你运行 .exe 时,系统会查看其清单。如果没有特殊标记,应用程序将以普通用户权限运行。我们的任务就是添加这个标记。
方法 1:添加清单(.NET Framework 的正确方法)
这是针对 .NET Framework 上经典 Windows Forms 或 WPF 应用程序的标准且最简单的方法。
步骤 1:创建或编辑 app.manifest 文件
在 Visual Studio 中,右键单击项目 → 添加 → 新建项 → 应用程序清单文件。如果文件已存在(例如 app.manifest),直接打开它。
你会看到包含大量注释的 XML。我们关注的是 requestedExecutionLevel 部分。将其修改为如下形式:
<?xml version="1.0" encoding="utf-8"?><assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <!-- 重要:就是这一行 --> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo></assembly>注意 level="requireAdministrator"。还有另外两个值:
asInvoker— 以父进程的权限运行(默认)。highestAvailable— 以当前用户可用的最大权限运行。
步骤 2:将清单与项目关联(如果未自动生效)
打开项目属性(右键单击项目 → 属性)。在应用程序选项卡中,找到资源部分,在“清单”下拉列表中选择 “app.manifest”。
完成!现在,当你运行 .exe 时,Windows 会立即显示 UAC 窗口:“是否允许此应用对你的设备进行更改?”。如果用户点击“是”,应用程序将获得完全的管理员权限。
方法 2:通过编程重新启动以提升权限(适用于 .NET Core / .NET 5+)
这种方法通用,甚至在 .NET Core、.NET 5/6/7/8 和 .NET Framework 中也能工作。有时清单不适用,因为:
- 你希望应用程序以普通权限启动,但某些功能需要提升权限。
- 你使用的是控制台应用程序或服务。
思路很简单:应用程序检查是否拥有权限。如果没有,它会使用 runas 参数重新启动自身(来自