【问题标题】:Bypassing elevation when launching a new process启动新进程时绕过提升
【发布时间】:2011-10-23 16:13:09
【问题描述】:

好的,这是我的问题:我正在尝试启动第三方应用程序。这个应用程序显然被配置为需要提升,大概是通过嵌入式清单。我的程序在非管理员用户的上下文中运行,我希望第三方应用程序在相同的上下文中运行。

当我调用 CreateProcess 时,它返回错误代码 740,“请求的操作需要提升。”

我尝试了 CREATE_PRESERVE_CODE_AUTHZ_LEVEL 标志,听起来很相关,但没有任何区别。

第三方应用程序确实可以在没有管理员权限的情况下工作,例如,如果我禁用 UAC 然后以非管理员身份运行它。

提前感谢您提供的任何提示/想法。

【问题讨论】:

  • 供应商已经解释了提升的原因 - 应用程序需要与用户的其他进程交互,如果它们被提升,它就无法做到这一点,而事实并非如此。在这种情况下,这当然不是问题,因为用户的任何进程都不会被提升。

标签: windows windows-7 uac


【解决方案1】:

另一种可能的解决方案是使用Microsoft Application Compatibility Toolkit 创建和安装自定义兼容性数据库,将RunAsInvoker fixRunAsHighest fix 应用于相关应用程序。虽然文档没有说明这是否适用于在清单中设置了 requireAdministrator 的应用程序,但我已经对此进行了测试,它对我有用。

您可以使用sdbinst command-line tool 以编程方式安装兼容性数据库。

(在大多数情况下,Norbert's answer 使用起来会简单得多,但可能会有一些极端情况。特别是,如果您的程序不直接负责启动有问题的可执行文件,则使用兼容性修复可能会更好。)

【讨论】:

    【解决方案2】:

    在名称中包含 UPDATE 或 SETUP 或 INSTALL 的一些非常简单的程序中也需要此提升;与清单无关。我们用 PICK BASIC 编写在 Win2008 上运行的代码,如果我们编写一个名为 UPDATE.TEST 的 HELLO WORLD 程序,我们无法在没有提升的情况下运行它。我们需要做的就是重命名程序来修复......但是很烦人,顺便说一句。

    【讨论】:

    • 这与清单有关!如果 EXE 不包含清单,则 Windows 会尝试猜测程序是否需要提升。此逻辑仅适用于 32 位可执行映像,并且像 setupinstallupdate 之类的词会触发 UAC。如果您将清单添加到此类请求asInvoker 执行级别的 .exe,Windows 将遵守该设置,并且不会显示 UAC 确认。
    【解决方案3】:

    将您的进程的环境变量 __compat_layer 设置为 RunAsInvoker。如果设置了这个环境变量,CreateProcess就会成功。

    您可以为此使用SetEnvironmentVariable 函数。

    【讨论】:

      【解决方案4】:

      恐怕没有办法解决。

      如果 UAC 已启用并且程序显示它需要提升,则系统会尝试以提升的身份运行此进程。如果你没有被提升,CreateProcess 不会启动这样的过程。

      使用ShellExecuteShellExecuteEx 函数来启动这个第三方应用程序。如果用户单击Yes,这些功能将显示 UAC 确认并启动该过程。启动此第三方应用程序的 UI 元素应具有 UAC-shield 以通知用户将显示 UAC 确认。

      【讨论】:

      • 谢谢。对我来说似乎很奇怪,没有任何简单的方法可以忽略清单。我相信从我所读到的 Microsoft 应用程序兼容性工具包可能会提供一个解决方案。
      • 此外,ShellExecute 在这种情况下也不起作用,因为最终用户实际上没有使用 UAC 提示符所需的管理凭据。
      • @Harry 我还没有看到任何提到清单的文章可以被忽略。这就是重点:如果程序声明它需要管理员权限,那么操作系统就会信任程序作者并尝试给予他们。顺便说一句,声明的级别是什么:requireAdministratorhighestAvailable
      • @Harry 用户无需成为管理员组的成员即可使用 UAC。如果是,则 UAC 会显示一个简单的提升确认;如果不是,他们必须提供管理员凭据。但是,在后一种情况下,用户不会知道管理员密码。
      猜你喜欢
      • 2011-04-25
      • 2011-10-07
      • 2014-08-20
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2010-11-10
      相关资源
      最近更新 更多