无权访问私有 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的主要内容,如果未能解决你的问题,请参考以下文章