PostMessage,SendMessage跨不同权限进程通信失效的解决办法

本文探讨了在Windows环境下,UAC(用户账户控制)与UIPI(用户界面特权隔离)机制如何实现不同权限级别的进程间的交互限制。通过使用Process Explorer工具查看进程权限,了解如何解决进程间无法发送消息的问题,并介绍了UIPI机制的其他限制及允许的消息类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vista之后的windows引入了UAC(用户账户控制),意味着在同一个windows用户账号下,允许用户进程在运行时拥有不同的权限级别。而且低级别的进程不能向高级别进程发送消息,完成这件事情的技术叫做UIPI(用户界面特权隔离)。

如果在实际项目中出现了这种两个进程间无法发送消息时,我们应该第一时间排查是否需是因为进程运行权限导致的问题。最简单直观的方式可以通过提升各自软件的权限看是否还存在这种问题。当然最好还是借助下工具,可以把问题看得更加透彻。推荐使用Windows Sysinternals 的Process Explorer查看权限级别。具体使用方法如下:

运行软件后选择添加列:



通过查看Integrity(完整性)列,既可以看出来各个进程运行时权限。

在确定是该问题后,我们如何解决呢。其实微软为了兼容之前版本的软件,已经提供了api帮助处理这种情况,具体的api是ChangeWindowMessageFilter和ChangeWindowMessageFilterEx,可以自行查看msdn。


顺便说明下UIPI的其他限制:

较低权限的应用程序不能做如下操作:

•   验证更高权限进程创建的窗口。调用 SendMessage 或 PostMessage到更高权限进程创建的窗口

•   使用线程钩子来附加一个更高权限的进程。

•   使用日志钩子(SetWindowsHookEx) 来监视更高权限的进程

•   DLL注入到更高权限的进程。

另外下列windows消息永远是允许状态:

•   0x000 - WM_NULL

•   0x003 - WM_MOVE

•   0x005 - WM_SIZE

•   0x00D - WM_GETTEXT

•   0x00E - WM_GETTEXTLENGTH

•   0x033 - WM_GETHOTKEY

•   0x07F - WM_GETICON

•   0x305 - WM_RENDERFORMAT

•   0x308 - WM_DRAWCLIPBOARD

•   0x30D - WM_CHANGECBCHAIN

•   0x31A - WM_THEMECHANGED


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值