如何在具有管理员权限的进程中启动一个不需要管理员权限的新进程?

47

我正在创建一个应用程序的自动更新器。该应用程序由用户启动,无需管理员特权即可运行。自动更新器使用管理员特权启动,并在下载新文件之前杀死应用程序。

问题在于,当自动更新器完成后,我想启动更新的应用程序。如果我使用常规的System.Diagnostics.Process.Start(file),应用程序也会以管理员特权启动,并且必须作为当前用户运行才能正常工作。

那么,如何使自动更新器作为当前用户而不是管理员启动应用程序呢?

我尝试使用以下方法:

var pSI = new ProcessStartInfo() { 
    UseShellExecute = false, 
    UserName = Environment.UserName, 
    FileName = file 
};
System.Diagnostics.Process.Start(pSI);

但是这会抛出错误"无效的用户名或密码"。 我已经确认用户名是正确的,并且我理解密码可能无效,因为我没有包含它。 但是要求用户输入他/她的密码不是一个选项,因为启动应用程序自动化的整个原因是为了使用户更容易使用。

有什么建议吗?


这个回答描述了一种方法,其中你需要复制当前进程令牌,使用 SetTokenInformation 删除高完整性SID,然后使用修改后的令牌使用 CreateProcessAsUser 启动新进程。 - Simon MᶜKenzie
我知道这已经过时了,但我在这里找到了一个非常好的方法,比这篇文章上的答案对我更有效。CreateProcessWithTokenW调用失败了。这个链接可以解决问题:https://code.msdn.microsoft.com/windowsapps/CSCreateLowIntegrityProcess-d7cb5e4d/sourcecode?fileId=52580&pathId=1953311234 - tdemay
C++问题对应于这个问题:https://dev59.com/lpjga4cB1Zd3GeqPHDrR - NH.
11个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接