首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行非提升的子进程/As管理进程。

运行非提升的子进程/As管理进程。
EN

Stack Overflow用户
提问于 2015-05-09 23:13:39
回答 1查看 2.4K关注 0票数 4

我的应用程序通过另一个名为"updater.exe“的应用程序有一个内置的自我更新系统,该应用程序位于要更新的主应用程序的同一个文件夹中。它下载最新版本,终止旧版本(如果正在运行),然后覆盖它。

问题是,要做到这一点,必须使用管理员特权运行updater.exe才能访问C:\Program Files\MyApp

到目前为止,主应用程序以管理权限运行updater.exe (使用UAC),但是问题出现了:

更新完成后,我希望新安装的版本自动启动。你猜怎么着?当然,主应用程序也以管理权限运行。风景很简单:

代码语言:javascript
复制
Main app[running as user] --> Updater App[run as admin] --> Main app[ADMIN again]

仅仅因为我的应用程序使用My.Settings对象,它在作为admin运行时就会丢失所有存储的设置,因为通常情况下,它总是以普通用户的身份启动,而且您可能知道,My.Settingsuser-sensivite对象。

我怎样才能解决这个问题呢?我到处搜索,但没有找到任何与“以正常用户身份运行”有关的内容,但始终以管理员的身份运行,这很容易。

老实说,另一方面,我认为这样的事情是不可能的,因为更新程序不能知道哪个特定的用户启动了它。或者可以吗?这里有什么东西我遗漏了吗?

如果我是对的,这是唯一的选择,不使用My.Settings,但Windows存储用户的首选项?

现在谢了。

EN

回答 1

Stack Overflow用户

发布于 2015-06-10 01:39:30

“去提升”子进程的一种方法是通过资源管理器启动它。这通常应该适用于正常的Win用户。但是如果资源管理器本身正在运行,那么你试图启动的应用程序也会被提升。资源管理器可能正在运行,因为:

  • 主动用户是Admin (不仅仅是具有管理权限的用户)
  • Explorer.exe是从一个命令窗口启动的,which...you得到了,正在运行。

..。可能还有其他人。

更好的做法是将其视为启动具有默认权限的应用程序。如果运行高架资源管理器将启动新实例提升,但原始的第一个主应用程序实例也会运行提升。

使用复选框来测试代码以启动同一个应用程序,以选择提升与否:

代码语言:javascript
复制
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号也是一样的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30146027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档