访问消息队列系统被拒绝

问题描述 投票:0回答:11

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

msmq
11个回答
34
投票

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


16
投票

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

我的网络应用程序以

NETWORK SERVICE
运行,这催生了

访问消息队列系统被拒绝

错误。

我通过给予

NETWORK SERVICE
完全控制来解决这个问题:

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

重新启动 MSMQ 服务和 IIS:

NET STOP MSMQ
NET START MSMQ
IISRESET

13
投票

服务器2008:

  1. 控制

    Panel->Administration Tools->Computer Management

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

  3. 右键单击
    [UrQueueName] -> Properties -> Security
    • 让每个人都完全控制
    • 将匿名登录设置为完全控制。
  4. 在电脑中
    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)); 

10
投票

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

原来的问题

...令人沮丧,该队列列在“服务器管理”中的“专用队列”下,但我无法:

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

解决方案

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

错误消息不应再出现

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


7
投票

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

您还可以得到其他原因:

无法从远程 MSMQ 队列读取


4
投票

导致此错误的原因有很多。第一,可能是安全。您需要确保运行应用程序的帐户具有对队列的读/写访问权限(或根据需要具有较高的权限级别)。

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


4
投票

对于我们来说,这是因为测试程序创建了队列......

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


4
投票

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

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


0
投票

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


0
投票

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

我们必须将应用程序池标识从“ApplicationPoolIdentity”更改为“NetworkService”。后来就成功了。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.