启动新进程时绕过高程

时间:2011-08-09 23:36:53

标签: windows windows-7 uac

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

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

我已经尝试过CREATE_PRESERVE_CODE_AUTHZ_LEVEL标志,这听起来很有意义,但没有区别。

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

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

4 个答案:

答案 0 :(得分:8)

将流程的环境变量 __ compat_layer 设置为 RunAsInvoker 。如果设置了此环境变量,CreateProcess将成功。

您可以使用SetEnvironmentVariable功能来实现此目的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我担心没办法解决它。

如果启用了UAC并且程序显示需要提升,则系统会尝试以提升的方式运行此过程。如果你没有升职,CreateProcess就不会开始这样的过程。

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

答案 3 :(得分:0)

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

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

(在大多数情况下,Norbert's answer使用起来会相当简单,但可能存在边缘情况。特别是,如果您的程序不直接负责启动有问题的可执行文件,那么使用兼容性修补程序可能更为可取。 )