出于安全原因,我的应用程序的 UI 模块以high
强制完整性级别运行。它里面的一切都很好,除了一件事。为了与旧版本兼容,我需要能够让用户向 UI 模块发出命令行调用。
目前这个机制是这样工作的:
Windows 资源管理器中的快捷方式调用我的模块,如下所示:
path-to-module\module.exe -op="a, s, r"
当进程解析此命令行时,它会使用FindWindow通过其唯一的类名
module.exe
来定位 UI 模块的运行副本(或 self 的另一个副本) 。然后它使用PostMessage API向它发送一条已注册的消息。然后正在运行的 UI 模块(具有
high
完整性级别),当它收到消息时,会相应地处理它。
问题是由于UI模块的运行副本具有high
完整性级别,它无法接收来自较低完整性级别的消息,或者当它被Windows资源管理器运行以解析快捷命令时,它无法接收到该模块的副本,从而使其medium
完整运行等级。
为了解决这个问题,我找到了这个UIAccess
标志(请参阅此处,并向下滚动到它显示“ UIAccess for UI automation applications ”的位置。)
所以我的假设是,如果我设置这个标志并对我的 UI 模块进行代码签名:
它将能够绕过我上面描述的 UIPI 限制。
它运行得很好:
但是我看到的是,当我从以完整性级别PostMessage
运行的模块调用它时,我上面描述的算法中的 API 仍然失败并出现 ERROR_ACCESS_DENIED 。medium
我在那里错过了什么?