Windows Server 2022 MSMQ消息接收异常:消息已抵达但队列未填充
追踪显示消息已抵达目标服务器但未进入私有队列,且已授予全队列权限,可按以下步骤排查:
检查死信队列
打开计算机管理 > 服务和应用程序 > 消息队列 > 私有队列 > 系统队列 > 私有死信队列,查看是否有滞留的消息。消息属性中的Delivery Failure和Reason字段会直接说明失败原因,比如身份验证失败、队列类型不匹配等。验证队列身份验证设置
右键2022上的目标私有队列 → 属性 → 安全性选项卡,确认是否勾选需要身份验证。若勾选但发送端未提供可信凭证(如非域账号发送、未启用身份验证),消息会被拒绝进入死信队列。可临时取消勾选测试是否恢复正常。调整MSMQ加密级别兼容性
Windows Server 2022默认加密级别可能高于2012,导致消息加密不兼容:- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters - 新建DWORD值
EncryptionLevel,设置为1(无加密,仅用于测试) - 重启
Message Queuing服务
测试成功后,可根据需求调整为合适级别(2=签名,3=加密+签名)。
- 打开注册表编辑器,定位到
确认事务性属性匹配
若发送端使用事务性发送,而目标队列是非事务性的,消息会被丢弃。检查两端队列属性→常规选项卡,确保事务性勾选状态一致(要么都勾选,要么都不勾选)。检查MSMQ服务账号存储权限
2022上MSMQ默认以Network Service账号运行,需确认该账号对队列存储目录(默认C:\Windows\System32\msmq\storage)有读写权限:右键目录→属性→安全选项卡,添加或确认Network Service的读取和写入权限。排查防火墙规则
虽然消息已抵达,但防火墙可能限制了最终存储环节:打开Windows Defender防火墙,确认启用了Message Queuing、Message Queuing (RPC)、Message Queuing (SMB)的入站/出站规则,或临时关闭防火墙测试。查看MSMQ事件日志
打开事件查看器→应用程序和服务日志 > Microsoft > Windows > MSMQ,查看Operational和Admin日志,里面会记录消息处理失败的错误代码和详细原因,比如0xC00E0025(队列不存在)、0xC00E002F(权限不足)。
内容的提问来源于stack exchange,提问作者Vishal Vanga

