启动新stream程时绕过海拔

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

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

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

第三方应用程序没有pipe理员权限,例如,如果我禁用UAC,然后作为非pipe理员运行它。

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

Solutions Collecting From Web of "启动新stream程时绕过海拔"

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

您可以使用SetEnvironmentVariable函数来达到此目的。

在一些非常简单的程序中,这个标高也是必需的,这些程序的名称中有UPDATE或SETUP或INSTALL; 与清单无关。 我们在Win2008上运行的PICK BASIC中编写代码,如果我们编写一个叫做UPDATE.TEST的HELLO WORLD程序,我们不能在没有提升的情况下运行它。 我们所需要做的是重命名程序来解决…但烦人的,并btws。

恐怕没有办法解决它。

如果启用UAC并且程序显示它需要提升,那么系统会尝试运行这个过程。 如果你没有升级, CreateProcess将不会启动这样的过程。

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

另一种可能的解决方案是使用Microsoft应用程序兼容性工具包来创建和安装自定义兼容性数据库,将RunAsInvoker修复程序或RunAsHighest修复程序应用于相关应用程序。 尽管文档没有说明这是否适用于需要在清单中设置管理员的应用程序,但我已经测试过了,它对我很有用。

您可以使用sdbinst命令行工具以编程方式安装兼容性数据库。

(在大多数情况下, Norbert的答案将会相当简单,但可能会出现边缘情况,特别是如果您的程序不直接负责启动有问题的可执行文件,则使用兼容性修补程序可能会更好。