【问题标题】:ShellExecute Fails if Run from Application Launched as Administrator如果从以管理员身份启动的应用程序运行,ShellExecute 将失败
【发布时间】:2019-07-11 00:13:05
【问题描述】:

我的 C++ 应用程序使用 ShellExecute 打开 PDF 文件。我正在使用 Windows 10 Enterprise LTSC(版本 1809,操作系统版本 17763.615)来运行我的应用程序。如果我的应用程序以管理员身份启动(右键单击Run as administrator),则无法打开 PDF 文件。但是,如果我的应用程序在没有管理员权限的情况下启动(只需双击它),那么 Adob​​e(默认 PDF 阅读器)就会成功启动并且 PDF 会正确显示。

我的应用程序在 Windows 7 和 Windows 10 Pro 上正常运行(有和没有Run as admin)。现在我们正在尝试使用 Windows 10 Enterprise LTSC,这个问题才刚刚开始发生。

我的应用程序的实际代码是:

ShellExecute(NULL, NULL, full_path.toWideCharPointer(), NULL, NULL, SW_SHOWDEFAULT);

其中full_path 例如等于"C:\\Faxitron\\Docs\\Guide.pdf"

在这两种情况下(管理员与否),ShellExecute 总是返回 42,GetLastError 返回 0。这里有一些有趣的事情:当我以管理员身份运行我的应用程序时,任务管理器在我的应用程序下显示了两个 Adobe Acrobat Reader DC (32 bit) 进程,但 Adob​​e 程序从未启动/打开。

不确定这是否相关,但我使用的是最新版本的 Adob​​e Acrobat Reader DC(版本 19.012.20034)。

最后,我的应用程序需要以管理员身份运行(其他功能才能正常工作)。以管理员身份运行应用程序时,有没有办法让ShellExecute 工作?

【问题讨论】:

  • 您是否尝试过使用参数 Guide.pdf 启动 Adob​​e.exe ?
  • ShellExecute 在第二个参数上,看来你可以提供open 命令,你试过吗?我知道当您使用 NULL 参数时,Windows 会在许多对象上回退,但您自己提供它们可能是值得的。
  • 我尝试使用 PDF 作为参数启动 AcroRd32.exe(这显然是 Adob​​e 命令),但没有成功。使用open 也不起作用。

标签: c++ pdf windows-10 shellexecute adobe-reader


【解决方案1】:

在这种情况下,ShellExecute 无法从提升的进程 启动 PDF 查看器的原因是 Adob​​e Reader 通过其保护模式阻止了它。要解决此问题,请执行以下操作禁用保护模式:

  1. 打开 Adob​​e Reader。
  2. 选择编辑>首选项...
  3. 在左侧的类别列表中,选择Security(Enhanced)。
  4. 沙盒保护部分,取消选择 启动时启用保护模式
  5. 点击确定保存更改。
  6. 关闭 Adob​​e Reader。

有关保护模式(以及可能的漏洞)的更多信息,请参阅 Adob​​e.com 的此链接: https://www.adobe.com/devnet-docs/acrobatetk/tools/AppSec/protectedmode.html

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多