【问题标题】:Start program with user rights from within a elevated program从提升的程序中以用户权限启动程序
【发布时间】:2013-06-13 17:13:57
【问题描述】:

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

有什么办法可以做到吗? (它会在 Delphi 中,但对于这个问题,语言可能无关紧要)。

【问题讨论】:

标签: winapi elevation


【解决方案1】:

不幸的是,没有真正直接的方法可以做到这一点。

一种方法是使用任务计划程序 - 您可以使用ITaskService 接口来安排任务立即运行,使用当前登录用户的非提升凭据。

【讨论】:

    【解决方案2】:

    您想要实现的目标不能很容易地完成,并且不受支持。但是,可以使用少量的黑客攻击。 Aaron Margosis 写了一封 article 描述了一种技术。

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

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

    本文包含一些演示 C++ 源代码的下载链接,从中它应该足够简单,可以转换为 Delphi。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2012-02-13
    • 2021-01-09
    • 2013-03-06
    • 2011-12-16
    相关资源
    最近更新 更多