从提升的程序中启动具有用户权限的程序

时间:2013-06-17 16:52:05

标签: winapi elevation

我有一个需要提升权限的应用程序(它类似于自定义安装程序)。 在此应用程序中,我使用ShellExecute()来显示PDF文件。 似乎Adobe Reader的启动权与调用应用程序相同。我希望Adobe Reader能够以标准用户权限启动而不是提升。

有什么方法可以做到吗? (它将在Delphi中,但对于这个问题,语言可能并不重要)。

2 个答案:

答案 0 :(得分:0)

不幸的是,没有真正直接的方法。

您可以使用任务计划程序执行此操作的一种方法 - 使用ITaskService界面安排任务立即运行,使用当前登录用户的非提升凭据。

答案 1 :(得分:0)

您想要实现的目标不能轻易完成,也不受支持。但是,可以使用少量的黑客攻击。 Aaron Margosis写了一篇描述一种技巧的article

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

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

本文包含一些演示C ++源代码的下载链接,从中可以很容易地转换为Delphi。