好的,这是我的问题:我正在尝试启动第三方应用程序。该应用程序显然被配置为需要提升,可能是通过嵌入式清单。我的程序在非管理用户的上下文中运行,我希望第三方应用程序在相同的上下文中运行。
当我调用CreateProcess时,它返回错误代码740,“请求的操作需要提升。”
我已经尝试过CREATE_PRESERVE_CODE_AUTHZ_LEVEL标志,这听起来很有意义,但没有区别。
第三方应用程序在没有管理员权限的情况下工作,例如,如果我禁用UAC,然后以非管理员身份运行它。
提前感谢您提供的任何提示/想法。
答案 0 :(得分:8)
将流程的环境变量 __ compat_layer 设置为 RunAsInvoker 。如果设置了此环境变量,CreateProcess将成功。
您可以使用SetEnvironmentVariable功能来实现此目的。
答案 1 :(得分:1)
在名称中包含UPDATE或SETUP或INSTALL的一些非常简单的程序中也需要此提升;与清单无关。我们在Win2008上运行的PICK BASIC中编写代码,如果我们编写一个名为UPDATE.TEST的HELLO WORLD程序,我们就无法在没有提升的情况下运行它。我们需要做的就是重命名程序以修复...但是很烦人,而且顺便说一下。
答案 2 :(得分:0)
我担心没办法解决它。
如果启用了UAC并且程序显示需要提升,则系统会尝试以提升的方式运行此过程。如果你没有升职,CreateProcess
就不会开始这样的过程。
使用ShellExecute
或ShellExecuteEx
函数启动此第三方应用程序。如果用户单击是,这些功能将显示UAC确认并启动该过程。启动此第三方应用程序的UI元素应具有UAC-shield,以通知用户将显示UAC确认。
答案 3 :(得分:0)
另一种可能的解决方案是使用Microsoft Application Compatibility Toolkit创建并安装自定义兼容性数据库,该数据库将RunAsInvoker fix或RunAsHighest fix应用于相关应用程序。虽然文档没有说明这是否适用于清单中设置了requireAdministrator的应用程序,但我已对此进行了测试,它对我有用。
您可以使用sdbinst command-line tool以编程方式安装兼容性数据库。
(在大多数情况下,Norbert's answer使用起来会相当简单,但可能存在边缘情况。特别是,如果您的程序不直接负责启动有问题的可执行文件,那么使用兼容性修补程序可能更为可取。 )