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

时间:2015-08-28 15:41:09

标签: c# msmq

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

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

Peek调用因MessageQueueException“拒绝访问消息队列系统”而失败。

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

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

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

然而,似乎任何这些事情都是问题,我也无法使用其他工具。

修改 我已经能够使用MSMQQueueInfo / MSMQQueue COM对象使其工作,而无需更改任何凭据。 如果我可以使用.NET库使其工作,那将是很好的,但至少我有一个解决方法。

3 个答案:

答案 0 :(得分:3)

我的问题是,当GetPrivateQueuesByMachine用于获取队列时,它使用SendAndReceive的访问模式,这要求获得更多权限。我不得不使用MessageQueue构造函数来指定AccessMode。 (在这种情况下是Peek。)

最后,我能够使用类似于以下内容的代码来实现此目的:

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

答案 1 :(得分:2)

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

如果您使用多线程,请尝试在同一个线程中保持初始化和访问功能。

答案 2 :(得分:2)

队列显示在各种实用程序中只是没有告诉你那么多。这样的实用程序不太可能偷看消息。通常,默认访问权限允许每个人查看队列并向其发布消息。但是没有找回它们。

在拥有此队列的计算机上,使用“控制面板”>管理工具>计算机管理>服务和应用>消息队列>私人队列。选择队列并右键单击>属性>安全选项卡。请注意Everbody如何拥有某些权限,例如“获取属性”和“发送消息”。但不是“偷看消息”。

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