拒绝访问消息队列系统

Posted

技术标签:

【中文标题】拒绝访问消息队列系统【英文标题】:Access to Message Queuing system is denied 【发布时间】:2012-04-10 02:30:26 【问题描述】:

我正在尝试从我的主机访问队列消息,在尝试获取消息时我收到“访问消息队列系统被拒绝”。信息。不知道如何解决这个问题。我使用 Windows 7 作为客户端系统,服务器是 Windows 2008 R2 Server

【问题讨论】:

【参考方案1】:

我在尝试通过 ASP.NET (Windows 7) 写入 MSMQ 时遇到了同样的问题。我添加了“接收消息”“查看消息”和“发送消息”权限,它现在可以正常工作。如果您通过 ASP.NET 运行它,那么您可能在 IIS_IUSRS 帐户下。

【讨论】:

如何添加这些权限? 在计算机管理下(右键单击开始菜单中的“计算机”并选择“管理”),进入“消息队列”部分并右键单击您想要的队列名称并选择“属性” " --> 点击“安全”选项卡,您可以在那里管理权限。 我已经设置了这些权限,但它仍然抛出这个错误 @emirhosseini 如果安全对您来说不是一个大问题,您可以按照 Saille 的回答,他未选中:“禁用未经身份验证的 RPC 调用”【参考方案2】:

就我而言,MSMQ 队列归我自己的 Windows 用户帐户(本地管理员)所有,因为它们是通过在管理员模式下从 Visual Studio 运行控制台应用程序创建的。

我的网络应用以NETWORK SERVICE 运行,这催生了

对消息队列系统的访问被拒绝

错误。

我通过给予NETWORK SERVICE 完全控制权来解决这个问题:

计算机管理 > 服务和应用程序 > 消息队列 > 私有队列 > 右键单击队列 > 属性 > 安全

重启 MSMQ 服务和 IIS:

NET STOP MSMQ
NET START MSMQ
IISRESET

【讨论】:

【参考方案3】:

Server2008:

    控制Panel->Administration Tools->Computer Management

    Computer Management->Services and Applications->Message Queuing->Private Queues

    右键[UrQueueName] -> Properties -> Security 将所有人设置为完全控制 将匿名登录设置为完全控制。 在电脑里Management -> Services 重新启动消息队列服务。

在 Windows 7(客户端)中: 用FormatName:DIRECT=OS:MachineName\private$\UrQueueName创建Rc消息队列

例子:

rcmq = new System.Messaging.MessageQueue(string.Format("FormatName:DIRECT=OS:0\\private$\\1", rcMachineName,rcQueueName)); 

【讨论】:

【参考方案4】:

感谢这篇文章,我已经能够消除“拒绝访问”问题: https://codifying.wordpress.com/2012/04/16/msmq-solving-access-denied-errors-for-private-queues/

原来的问题

...令人沮丧,队列列在私有队列下的服务器管理中,但我不可能:

删除 => 权限被拒绝 编辑安全权限 => 权限被拒绝 查看队列中剩余的消息 => 权限被拒绝

解决方案

    手动创建队列(稍后使用),我们称之为FA1 关闭服务: 消息队列 (+ Net.Msmq 的侦听器适配器) 然后转到 System32/msmq/storage/lqs 找到FA1的最新文件(检查是否是正确的文件,这里的每个文件都可以用记事本打开)然后复制属性Security的值 找到与问题队列关联的文件,粘贴上一步复制的值 删除与FA1关联的文件 打开之前关闭的两个服务 转到服务器管理器

错误消息不应再出现

但是...在尝试读取/连接到该队列时,您的软件可能会遇到另一个问题,它会抱怨它没有足够的权限,所以最后一步是转到该队列的高级属性并为每个人设置完全控制访问权限(好吧,也许你会指定一个特定的用户,但我这样做是为了确保我不会在我自己的开发服务器上被阻止)。

【讨论】:

这是正确答案。唯一的补充是您需要将 FA1 文件的副本放回文件夹中,以便稍后删除临时 FA1 队列作为最后一步。【参考方案5】:

如果您尝试从远程队列中读取消息,那么权限是罪魁祸首,正如 kprobst 所提到的。

你也可以得到其他原因:

Failing to read from remote MSMQ queues

【讨论】:

【参考方案6】:

这个错误有很多原因。一,可能是安全性。您需要确保运行您的应用程序的帐户对队列具有读/写权限(或您需要的最高权限级别)。

其次,确保如果队列是事务性的,那么您使用的是正确的事务模式。或者,如果队列不是事务性的,那么您在读取或写入时没有尝试将事务模式传递给它。

【讨论】:

事务性/非事务性不会产生拒绝访问错误。您应该会收到特定于事务的错误 - 0xC00E0050 (MQ_ERROR_TRANSACTION_USAGE)。 @JohnBreakwell 感谢您的澄清,我做了一些谷歌搜索,结果出现了。对我来说会很奇怪,但我想我还是会提到它以防万一。罪魁祸首几乎总是权限。【参考方案7】:

对我们来说,这是因为一个测试程序创建了队列……

解决方案:删除队列并让它由在正确凭据下运行的正确进程重新创建。

【讨论】:

【参考方案8】:

这对我们有用: 服务器管理器 -> 功能 -> 消息队列 -> 右键单击​​ -> 属性 -> 服务器安全

取消选中:“禁用未经身份验证的 RPC 调用”

【讨论】:

【参考方案9】:

这可能会变成一个令人沮丧的问题。在我的场景中,BeginReceive() 上引发了异常。我有一个由 .Net 2.0 应用程序创建的现有消息队列,我试图在另一个运行于 .Net 4.0 上的应用程序中使用它。解决方案是删除 MSMQ(位于 C:\Windows\System32\msmq\storage\lqs ),然后使用 .Net 4.0 重新创建它。

【讨论】:

这很有趣。我认为您没有问题 LQS 文件的副本了吗? @JohnBreakwell 不再是,将应用程序从 .Net 2.0 升级到 4.0 是一种有趣的做法。我们面临着前所未有的新问题。【参考方案10】:

在我们的例子中,更改调用 Peek MSMQ 的 Web 服务的应用程序池的身份有助于解决在服务器迁移后开始发生的问题。

我们不得不将应用程序池标识从“ApplicationPoolIdentity”更改为“NetworkService”。后来它起作用了。

【讨论】:

【参考方案11】:

请登录您的服务器管理器并检查您的消息队列属性,这些属性已为 IIS 用户或所有人分配了“发送消息”、“查看消息”和其他所需权限..

【讨论】:

以上是关于拒绝访问消息队列系统的主要内容,如果未能解决你的问题,请参考以下文章

MSMQ 无法删除或清除队列

消息队列面试题汇总

消息队列之zookeeper

消息队列浅谈

如何清空Windows消息队列

IPC - 消息队列(Message Queue)- 使用