我有一个需要提升权限的应用程序(类似于自定义安装程序)。在这个应用程序中,我使用 ShellExecute() 来显示一个 PDF 文件。似乎 Adobe Reader 以与调用应用程序相同的权限启动。但是,我希望 Adobe Reader 以标准用户权限启动,而不是提升权限。
有什么办法可以做到吗?(它会在 Delphi 中,但对于这个问题,语言可能无关紧要)。
不幸的是,没有真正简单的方法可以做到这一点。
一种方法是使用任务计划程序 - 您使用该ITaskService
界面来安排任务立即运行,使用当前登录用户的非提升凭据。
您想要实现的目标不能很容易地完成,并且不受支持。但是,可以使用少量的黑客攻击。Aaron Margosis 写了一篇描述一种技术的文章。
要引用相关部分,您需要执行以下步骤:
- 在您当前的令牌中启用 SeIncreaseQuotaPrivilege
- 获取代表桌面外壳的 HWND (GetShellWindow)
- 获取与该窗口关联的进程的进程 ID (PID) (GetWindowThreadProcessId)
- 打开那个进程(OpenProcess)
- 从该进程获取访问令牌 (OpenProcessToken)
- 使用该令牌制作主令牌(DuplicateTokenEx)
- 使用该主令牌启动新进程 (CreateProcessWithTokenW)
该文章包含一些演示 C++ 源代码的下载链接,从中它应该足够简单,可以转换为 Delphi。