Delphi:以管理员身份运行的应用程序不会从非管理员应用程序接收消息

时间:2019-05-09 02:13:16

标签: delphi winapi sendmessage postmessage

我想使用SendMessage / PostMessage将消息发送到另一个应用程序,但是当另一个应用程序以管理员身份运行时,它永远不会收到消息。如何在不以管理员身份运行“发送”应用程序的情况下克服这一问题?

编辑:Remi的答案代码,接收器应用程序

DB_CONNECTION=mysql
DB_HOST=153.xx.x.xxx
DB_PORT=3306
DB_DATABASE=havanah_havyblog
DB_USERNAME=havanah_havyblog
DB_PASSWORD=xxxxxx

1 个答案:

答案 0 :(得分:5)

User Interface Privilege Isolation(UIPI)防止完整性较低的进程将窗口消息发送到完整性较高的进程。从软件角度来看,解决此局限性的唯一方法是:

  • 以更高的完整性级别运行发送应用程序(即,以提升的特权运行它)以匹配目标进程。

  • 如果您有权更改接收应用程序的源代码,则可以通过自身调用ChangeWindowMessageFilter()ChangeWindowMessageFilterEx()使其选择接收来自较低完整性进程的特定窗口消息。

  • 通过在其uiaccess=true应用清单元素中请求<requestedExecutionLevel>,使发送应用绕过UIPI。但是,这还有其他要求:

    • 该应用程序必须使用可以用安装在计算机上的根证书进行验证的证书进行数字签名。

    • 该应用必须安装在%ProgramFiles%及其子目录下的文件系统 1 (标准用户无法写入的文件)上的“安全”文件夹中,或者在%WinDir%及其子目录下(标准用户确实具有写访问权限的一些子目录除外)。

      1:此要求为configurable via a system policy

除了软件控制之外,唯一可用的其他选项要求更改系统策略以在系统级别完全禁用用户帐户控制(UAC)和/或UIPI。您不应该这样做。