无权访问私有 MSMQ

Posted

技术标签:

【中文标题】无权访问私有 MSMQ【英文标题】:No permission to access a private MSMQ 【发布时间】:2010-10-21 08:04:53 【问题描述】:

在 XP 机器上,有一个由 .net 服务创建的私有消息队列。 当我想在 VB6 应用程序中访问这个私有队列时,我不断收到“访问被拒绝”错误。 所以这似乎是一个安全问题,只是我不明白为什么即使我以管理员身份登录我仍然 无法访问在同一台机器上创建的队列。 还有什么我需要考虑的吗?

关于我如何在 VB6 中使用队列的示例

Public msgQueue As MSMQQueue

Private Sub OpenQueue()

    Dim MQ As New MSMQQueueInfo
        MQ .PathName = ".\Private$\incommingQueue"

    Set msgQueue = MQ.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)

End Sub

【问题讨论】:

您检查队列的安全性了吗? ACL 位于队列属性中,看起来就像文件夹属性。 如果我尝试修改队列的属性,我只会收到相同的消息“访问被拒绝”。 【参考方案1】:

此处发布的解决方案似乎有点骇人听闻。也许这对于 Windows XP 是必要的。我在使用 Windows 7 时遇到过类似的情况,并使用了不同的方法来解决这个问题。

情况:

程序由创建私有事务队列的 C# 代码组成 程序作为 Windows 服务运行,在本地系统帐户上运行。 服务运行时,会创建私有队列,并以本地系统帐户作为所有者。 即使我是管理员,我也无法检查队列中的消息。

解决方案(适用于 Windows 7):

    运行 compmgmt.msc 打开“服务和应用程序” 打开“消息队列” 打开“私有队列” 右键单击新创建的队列 点击“属性” 选择“安全”标签 点击“高级” 选择“所有者”标签 选择“管理员” 选择“权限”标签 点击“添加” 输入您的帐户名称(例如“管理员”) 点击“检查姓名” 点击“确定” 点击“确定” 点击“确定”

现在您可以访问队列中的消息,也可以根据需要清除队列。

【讨论】:

我已验证此方法适用于 Windows Server 2003。很棒的工作。另一个修复看起来确实像一个 hack,而这个更容易完成。 我必须在第 15 步和第 16 步之间单击“完全控制”复选框,但除此之外,是的,这适用于我的 Windows 7 机器,而且它比其他解决方案少得多。 当队列由 Windows 服务创建时,这不起作用,因为对队列的访问被拒绝,这正是原始问题中描述的情况。 这是更明显的方法,但在没有人授予队列“设置权限”权限的情况下不起作用,或者可能只有系统帐户或网络服务帐户具有该权限。如果是这种情况,则需要“破解”。 我已验证此方法适用于 Windows Server 2008 R2 :) 谢谢【参考方案2】:

如果 .NET 服务从私有队列的权限中删除了“Everyone”组,就会发生这种情况。您可以采取以下步骤来解决此问题:

    停止 MSMQ 服务

    打开文件夹C:\WINDOWS\system32\msmq\storage\lqs

    在此文件夹中找到描述您的队列的文件 -- (incommingQueue)

    使用记事本打开 lqs 文件以获得其他一些具有良好安全权限的私有队列。 (如果您没有任何其他私有队列,请创建一个)

    找到文件中以Security=....开头的行

    将整行复制到剪贴板(注意自动换行,这一行会很长)

    在文本编辑器中打开问题队列的 lqs 文件

    用剪贴板的内容覆盖此文件中的Security=...

    保存修改后的lqs文件

    启动 MSMQ 服务

您应该会发现问题队列现在与您在上面第 6 步中复制其安全设置的队列具有相同的权限。

【讨论】:

这听起来像一个可怕的黑客攻击。 当然可以通过队列的属性来完成,如下面的答案所述。 ***.com/a/3138438/1158692 用于查看队列属性的 UI 不可用,因为服务无法启动...这是因为我的一个队列处于不一致状态。这个hack是我唯一的出路。让我检查一下。

以上是关于无权访问私有 MSMQ的主要内容,如果未能解决你的问题,请参考以下文章

私有或公共 MSMQ

Delphi下MSMQ(Mircosoft Message Queue)实例(私有队列)

MSMQ 控制台显示消息计数,但没有私有队列的消息

为其他用户创建的专用队列设置 MSMQ 权限

MSMQ - 此计算机上尚未安装消息队列

当您拥有私有 NPM 包时,如何使用 CLI 部署到 Elastic Beanstalk?