我的应用程序通过另一个名为"updater.exe“的应用程序有一个内置的自我更新系统,该应用程序位于要更新的主应用程序的同一个文件夹中。它下载最新版本,终止旧版本(如果正在运行),然后覆盖它。
问题是,要做到这一点,必须使用管理员特权运行updater.exe才能访问C:\Program Files\MyApp
到目前为止,主应用程序以管理权限运行updater.exe (使用UAC),但是问题出现了:
更新完成后,我希望新安装的版本自动启动。你猜怎么着?当然,主应用程序也以管理权限运行。风景很简单:
Main app[running as user] --> Updater App[run as admin] --> Main app[ADMIN again]仅仅因为我的应用程序使用My.Settings对象,它在作为admin运行时就会丢失所有存储的设置,因为通常情况下,它总是以普通用户的身份启动,而且您可能知道,My.Settings是user-sensivite对象。
我怎样才能解决这个问题呢?我到处搜索,但没有找到任何与“以正常用户身份运行”有关的内容,但始终以管理员的身份运行,这很容易。
老实说,另一方面,我认为这样的事情是不可能的,因为更新程序不能知道哪个特定的用户启动了它。或者可以吗?这里有什么东西我遗漏了吗?
如果我是对的,这是唯一的选择,不使用My.Settings,但Windows存储用户的首选项?
现在谢了。
发布于 2015-06-10 01:39:30
“去提升”子进程的一种方法是通过资源管理器启动它。这通常应该适用于正常的Win用户。但是如果资源管理器本身正在运行,那么你试图启动的应用程序也会被提升。资源管理器可能正在运行,因为:
Explorer.exe是从一个命令窗口启动的,which...you得到了,正在运行。..。可能还有其他人。
更好的做法是将其视为启动具有默认权限的应用程序。如果运行高架资源管理器将启动新实例提升,但原始的第一个主应用程序实例也会运行提升。
使用复选框来测试代码以启动同一个应用程序,以选择提升与否:
Dim proc = New Process
proc.StartInfo.UseShellExecute = True
proc.StartInfo.WindowStyle = ProcessWindowStyle.Normal
proc.StartInfo.WorkingDirectory = mypath
If chkAdmin.Checked Then ' run this app as admin
proc.StartInfo.FileName = myApp
proc.StartInfo.WorkingDirectory = mypath
proc.StartInfo.Verb = "runas" ' run "me" as admin
proc.StartInfo.Arguments = ""
Else ' run explorer w/app as arg
' de-elevate new app instance to run de-elevated
proc.StartInfo.FileName = Path.Combine(windir, "explorer.exe")
proc.StartInfo.Verb = "" ' important!
proc.StartInfo.Arguments = myApp ' send the child app name as arg
End If
proc.Start()此图像显示结果:

窗体顶部的标签指示该应用程序是否处于提升状态,每个应用程序实例都由其前面的一个实例启动。
第二个窗口正在上升。启动下一个实例时,不选中As Admin的复选框;因此,第三个实例是通过Explorer启动的,并且没有运行提升。从5号开始的4号也是一样的。
https://stackoverflow.com/questions/30146027
复制相似问题