一尘不染

如何从具有管理员权限的进程开始没有管理员权限的新进程?

c#

我正在为应用程序创建一个自动更新程序。该应用程序由用户启动,并且在没有管理员特权的情况下运行。自动更新程序以管理员权限启动,并在下载新文件之前将其杀死。

当我要在自动更新程序完成后启动更新的应用程序时,就会出现问题。如果我使用常规的System.Diagnostics.Process.Start(file),该应用程序也将以管理员权限启动,并且
必须 在当前用户上运行才能正常工作。

因此,如何使自动更新程序以当前用户而不是管理员身份启动应用程序?

我尝试使用以下方法:

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

但这会引发错误“无效的用户名或密码”。我检查了用户名是否正确,并且我知道该密码可能无效,因为我没有提供该密码。但这不是要求用户输入密码的选择,因为自动启动应用程序的全部原因是使用户更容易。

有什么建议么?


阅读 365

收藏
2020-05-19

共1个答案

一尘不染

您尝试实现的目标非常困难,并且不受支持。但是,可以使用少量黑客手段。亚伦·玛格西斯(Aaron
Margosis)写了一篇文章,描述了一种技术。

要引用相关部分,您将需要执行以下步骤:

  1. 在您当前的令牌中启用SeIncreaseQuotaPrivilege
  2. 获取代表桌面外壳的HWND(GetShellWindow)
  3. 获取与该窗口关联的进程的进程ID(PID)(GetWindowThreadProcessId)
  4. 打开该进程(OpenProcess)
  5. 从该进程获取访问令牌(OpenProcessToken)
  6. 使用该令牌制作主令牌(DuplicateTokenEx)
  7. 使用该主令牌(CreateProcessWithTokenW)启动新进程

本文包含一些演示C ++源代码的下载链接,从中应该足够容易地转换为C#。

2020-05-19