无权访问私有MSMQ

Mez*_*Mez 25 vb6 msmq

在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
Run Code Online (Sandbox Code Playgroud)

Jos*_*lio 52

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

  1. 停止MSMQ服务

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

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

  4. 使用记事本,打开具有良好安全权限的其他私有队列的lqs文件.(如果你没有任何其他私人队列创建一个)

  5. 在开始的文件中找到该行 Security=....

  6. 将整行复制到剪贴板(注意Word Wrap,此行将很长)

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

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

  9. 保存修改后的lqs文件

  10. 启动MSMQ服务

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


小智 27

这里发布的解决方案似乎有点像黑客.也许这对Windows XP来说是必要的.我在使用Windows 7时遇到了类似的问题,并使用了不同的方法来解决这个问题.

情况:

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

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

  1. 运行compmgmt.msc
  2. 打开'服务和应用'
  3. 打开'消息队列'
  4. 打开'私人队列'
  5. 右键单击新创建的队列
  6. 点击"属性"
  7. 选择"安全"标签
  8. 点击"高级"
  9. 选择"所有者"标签
  10. 选择"管理员"
  11. 选择"权限"标签
  12. 点击"添加"
  13. 输入您帐户的名称(例如"管理员")
  14. 点击"检查姓名"
  15. 点击"确定"
  16. 点击"确定"
  17. 点击"确定"

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

  • 当队列由Windows服务创建时,这不起作用,因为对队列的访问被拒绝,这正是原始问题中描述的情况. (2认同)