无法以编程方式查看远程(私有)msmq:拒绝访问消息队列系统

Cannot programmatically peek into a remote (private) msmq: Access to Message Queuing system is denied

我有一个非常简单的控制台应用程序,它无法查看远程专用队列中的消息。

var queues = MessageQueue.GetPrivateQueuesByMachine(machineName);
var queue = queues.Where(x=>x.FormatName == queueName).Single();
Message message = queue.Peek();

Peek 调用失败,出现 "Access to Message Queuing system is denied" 的 MessageQueueException。

使用相同的客户端计算机和用户,我可以使用队列资源管理器和消息队列管理单元查看队列。

使用本地队列进行试验时,我只能通过取消对队列的 Peek 权限来重现错误,但这也会在其他工具中停止它。

我看到很多信息都指出了概述的问题 here

但是,如果这些事情中的任何一个是问题所在,我也无法使用其他工具来完成。

编辑 我已经能够在不更改任何凭据的情况下使用 MSMQQueueInfo/MSMQQueue COM 对象让它工作。 如果我可以使用 .NET 库使其工作,那就太好了,但至少我有一个解决方法。

我也遇到了同样的问题。在我的例子中,我在父线程中初始化 Message Queue 并在子线程中访问 Peek 函数。

如果您使用多线程,请尽量在同一个线程中保持函数的初始化和访问。

队列显示在各种实用程序中并不能告诉您太多信息。这样的实用程序不太可能偷看消息。通常,默认访问权限允许每个人查看队列和发送给它的 post 消息。但不检索它们。

在拥有此队列的机器上,使用控制面板 > 管理工具 > 计算机管理 > 服务和应用程序 > 消息队列 > 专用队列。 Select 队列并右键单击 > 属性 > 安全选项卡。请注意 Everbody 如何拥有一些权利,例如 "Get Properties" 和 "Send Message"。但不是 "Peek Message".

明智的做法是添加您在另一台计算机上使用的用户帐户,然后勾选完成工作所需的权限。如果这台机器由管理员管理,那么您需要让他们为您做这件事。

我的问题是,当使用 GetPrivateQueuesByMachine 获取队列时,它使用 SendAndReceive 的访问模式,这要求比我拥有的更多权限。我必须使用 MessageQueue 构造函数来指定 AccessMode。 (在本例中为 Peek。)

最后,我能够使用类似于以下的代码让它工作:

var queue = new MessageQueue(@"FormatName:DIRECT=OS:machineName\private$\queueName", QueueAccessMode.Peek);
Message message = queue.Peek();