在应用程序请求权限升级C#.NET

时间:2012-03-29 15:23:33

标签: c# .net uac

我有一个应用程序,在极少数情况下需要更改其注册表设置。在第一次执行期间,它还需要创建一个新密钥。我正在Windows 7中开发它。我得到ThrowUnauthorizedAccessException。如何强制Windows为我提供暂时提升权限的UAC提示?

提前致谢。

1 个答案:

答案 0 :(得分:3)

是否允许所有用户修改此设置?如果是这样,最简单的解决方案是修改安装程序,以提供注册表项的用户 Full Control

如果只有管理员应该能够修改此设置,那么您需要启动另一个程序副本,要求Windows提升它:

ProcessStartInfo startInfo = new ProcessStartInfo("C:\Path\To\MyApplication.exe");

startInfo.Verb = "runas"; //trigger a UAC prompt (if UAC is enabled)

System.Diagnostics.Process.Start(startInfo);

如果你很聪明,你会包含一些命令行参数,所以你可以告诉自己"它应该直接跳转到用户需要处理的软件部分。或者你的命令行参数可以说你想做什么

ProcessStartInfo startInfo = new ProcessStartInfo(
      "C:\Path\To\MyApplication.exe", 
      "/setLoggingEnabled yes");

startInfo.Verb = "runas"; //trigger a UAC prompt (if UAC is enabled)       

System.Diagnostics.Process.Start(startInfo);

让您的应用程序检查setLoggingEnabled开关,进行更改,然后退出。

更新:常见的情况是魔兽世界的玩家。由于允许游戏在运行时自行更新,因此必须允许所有用户修改Program Files中的游戏数据。 正确且有效的操作是修改

上的ACL
C:\Program Files\Blizzard\World of Warcraft

文件夹,以便所有用户都拥有完全控制权。事实上,在暴雪一起采取行动之前,微软发布了一个应用程序兼容性更新,让所有用户在下次以管理员身份运行时可以完全控制WoW文件夹。

另一个常见的情况是,当暴雪启动器启动管理privelages时,它会更新HKLM中的注册表项,记录游戏所在的 。例如,当我将WoW从硬盘驱动器移动到SSD驱动器时会发生这种情况

作为管理员运行启动器一次,以便更新程序正常工作。