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

本文关键字:msmq 拒绝访问 消息 系统 队列 私有 编程 方式 窥视 | 更新日期: 2023-09-27 18:10:11

我有一个非常简单的控制台应用程序,在远程私有队列中窥视消息时遇到麻烦。

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

Peek调用失败,并返回MessageQueueException "Access to Message Queuing system is denied"。

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

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

我看到了很多信息,这些信息指向了我这里列出的问题。

然而,似乎如果这些事情是问题,我将无法使用其他工具来完成它。

编辑我已经能够使用MSMQQueueInfo/msmqqueuecom对象使其工作,而无需更改任何凭据。如果我能使用。net库使其工作就好了,但至少我有一个解决方案。

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

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

最后,我能够使用类似于下面的代码使其工作:
var queue = new MessageQueue(@"FormatName:DIRECT=OS:machineName'private$'queueName", QueueAccessMode.Peek);
Message message = queue.Peek();

我也有同样的问题。在我的例子中,我在父线程中初始化消息队列,在子线程中访问Peek函数。

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

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

在拥有此队列的机器上,使用控制面板>管理工具>计算机管理>服务和应用程序>消息队列>私有队列。选择队列并右键单击> Properties> Security选项卡。注意每个人都有一些权限,比如"获取属性"answers"发送消息"。但不是"Peek Message"

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