问题:
在 Windows Server 2003 上打开 Windows“队列消息”时,我收到错误消息
"The list of messages cannot be retrieved. Error: Access is denied"
为什么?
按照以下步骤重新创建:
- Windows Server 2003 标准 64 位
- 右键单击“我的电脑”
- 选择管理
- 服务
- 消息队列
- 私人队列
- 我的服务
- 队列消息
显示的错误信息:
"The list of messages cannot be retrieved. Error: Access is denied."
当前部署的设置/配置:
- 以本地管理员身份登录。
- 机器是独立的。
- WCF 服务正在运行(使用 WCF 特定用户)
- WCF 用户帐户是本地 ADMIN 组的成员。
- 点网4.0。
- 混乱队列服务正在运行(本地系统)
- 可能是权限问题导致了错误。
答案1
如果 .NET 服务从私有队列的权限中删除了“Everyone”组,则可能会发生这种情况。您可以采取以下步骤来解决此问题:
- 停止 MSMQ 服务
- 打开文件夹 C:\WINDOWS\system32\msmq\storage\lqs
- 在此文件夹中找到描述您的队列的文件--(incommingQueue)
- 使用记事本,打开具有良好安全权限的其他私有队列的 lqs 文件。(如果您没有其他私有队列,请创建一个)
- 在文件中找到以 Security=... 开头的行。
- 将整行复制到剪贴板(注意自动换行,这一行会很长)
- 在文本编辑器中打开问题队列的 lqs 文件
- 使用剪贴板的内容覆盖此文件中的 Security=... 行
- 保存修改后的lqs文件
- 启动 MSMQ 服务
您应该发现问题队列现在具有与您在上面的第 6 步中复制其安全设置的队列相同的权限。
答案2
我认为值得从使用计算机管理 (compmgmt.msc) 或 Active Directory 用户和计算机 (dsa.msc) 检查队列、其对象和父容器的权限开始。后者可以在安装了 MSMQ 目录服务集成组件时使用,因为它允许将队列属性发布到目录。
以下是如何使用 Active Directory 用户和计算机 (dsa.msc) 执行此操作。确保在此管理单元的“视图”下,您已启用以下选项“用户、联系人、组和计算机作为容器”和“高级功能”,这些选项允许您找到托管 MSMQ 队列的计算机对象,展开它并调用属性以编辑队列容器 ACL,方式与处理文件/文件夹 ACL 相同(参见下面的示例屏幕截图)。您很可能需要取得所有权,然后才能对 ACL 进行任何更改。
您还可以使用计算机管理检查 ACL,方法是导航到计算机管理 > 消息队列并在那里找到您的队列或其父容器并检查/编辑 ACL。请参阅下面的示例屏幕截图。
但是,如果未安装 MSMQ 目录服务集成组件,您将不会在 Active Directory 用户和计算机管理单元中看到 MSMQ 队列,并且只能使用计算机管理来编辑 MSMQ 对象 ACL。
如果编辑 ACL 没有帮助,您应该查看上面的答案,其中涉及编辑位于 C:\Windows\System32\msmq\storage\lqs 下的队列文件。您也可以查看此博客文章了解详情。