【发布时间】:2015-07-20 16:19:06
【问题描述】:
我的应用程序通过另一个名为“updater.exe”的应用程序有一个内置的自我更新系统,该应用程序与要更新的主应用程序位于同一文件夹中。它下载最新版本,终止旧版本(如果它正在运行),然后覆盖它。
问题是,要做到这一点,updater.exe 必须以管理员权限运行才能访问C:\Program Files\MyApp
到目前为止一切顺利,主应用程序以管理员权限(使用 UAC)运行 updater.exe,但随后出现问题:
更新完成后,我希望新安装的版本自动启动。你猜怎么了?当然,主应用程序也以管理员权限运行。场景很简单:
Main app[running as user] --> Updater App[run as admin] --> Main app[ADMIN again]
仅仅因为我的应用程序使用My.Settings 对象,当它以管理员身份运行时它会丢失所有存储的设置,因为通常它总是以普通用户身份启动,并且您可能知道,My.Settings 是user-sensivite 对象。
如何解决此类问题?我四处搜索,但找不到与“以普通用户身份运行”相关的任何内容,但始终以管理员身份运行,这很容易。
老实说,另一方面,我认为这样的事情是不可能的,因为更新程序应用程序无法知道是哪个特定用户启动了它。或者可以吗?我在这里缺少什么吗?
如果我是对的,那么不使用 My.Settings 而是使用 Windows 注册表来存储用户首选项是唯一的选择吗?
现在谢谢。
【问题讨论】:
-
感谢您的链接!我想最简单的方法是您提供的第一个链接中的第二个答案。在运行更新程序之前从主应用程序运行另一个 exe(让我们说“autorestarter.exe”)是一个非常好的主意。所有“autorestarter”应该做的是等待“updater”进程完成(每1秒检查一次),当它结束时,再次启动主应用程序。最简单的解决方案。谢谢。
-
您是否已经在主应用中尝试过
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />? -
@RoniTovi 在这种情况下你可以使用 Process.WaitForExit() 。
标签: vb.net uac privileges runas my.settings