我正在为应用程序创建一个自动更新程序。该应用程序由用户启动,并且在没有管理员特权的情况下运行。自动更新程序以管理员权限启动,并在下载新文件之前将其杀死。
当我要在自动更新程序完成后启动更新的应用程序时,就会出现问题。如果我使用常规的System.Diagnostics.Process.Start(file),该应用程序也将以管理员权限启动,并且 必须 在当前用户上运行才能正常工作。
因此,如何使自动更新程序以当前用户而不是管理员身份启动应用程序?
我尝试使用以下方法:
var pSI = new ProcessStartInfo() { UseShellExecute = false, UserName = Environment.UserName, FileName = file }; System.Diagnostics.Process.Start(pSI);
但这会引发错误“无效的用户名或密码”。我检查了用户名是否正确,并且我知道该密码可能无效,因为我没有提供该密码。但这不是要求用户输入密码的选择,因为自动启动应用程序的全部原因是使用户更容易。
有什么建议么?
您尝试实现的目标非常困难,并且不受支持。但是,可以使用少量黑客手段。亚伦·玛格西斯(Aaron Margosis)写了一篇文章,描述了一种技术。
要引用相关部分,您将需要执行以下步骤:
在您当前的令牌中启用SeIncreaseQuotaPrivilege 获取代表桌面外壳的HWND(GetShellWindow) 获取与该窗口关联的进程的进程ID(PID)(GetWindowThreadProcessId) 打开该进程(OpenProcess) 从该进程获取访问令牌(OpenProcessToken) 使用该令牌制作主令牌(DuplicateTokenEx) 使用该主令牌(CreateProcessWithTokenW)启动新进程
本文包含一些演示C ++源代码的下载链接,从中应该足够容易地转换为C#。