Vb6 没有访问专用MSMQ的权限

Vb6 没有访问专用MSMQ的权限,vb6,msmq,Vb6,Msmq,在XP机器上,有一个由.net服务创建的私有消息队列。 当我想在VB6应用程序中访问此专用队列时,我不断收到“访问被拒绝”错误。 所以这似乎是一个安全问题,只是我不明白为什么即使我以管理员身份登录,我仍然 无法访问在同一台计算机上创建的队列。 还有什么我必须考虑的吗 关于如何在VB6中使用队列的示例 Public msgQueue As MSMQQueue Private Sub OpenQueue() Dim MQ As New MSMQQueueInfo MQ .

在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

如果.NET服务从专用队列的权限中删除了“Everyone”组,则可能会发生这种情况。以下是解决此问题的一些步骤:

  • 停止MSMQ服务

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

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

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

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

  • 将整行内容复制到剪贴板上(注意换行,这行会很长)

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

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

  • 保存修改后的lqs文件

  • 启动MSMQ服务


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

    这里发布的解决方案似乎有点老套。也许这对于Windows XP是必要的。我在使用Windows7时遇到过类似的情况,并使用了不同的方法来解决这个问题

    情况:

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

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

  • 现在,您可以访问队列中的消息,如果愿意,还可以清除队列。

    是否检查了队列的安全性?ACL位于队列属性中,看起来就像文件夹属性。如果我尝试修改队列属性,我只会收到相同的消息“拒绝访问”。我已验证此方法在Windows Server 2003上有效。干得好。另一个修复看起来确实像是一个黑客,而这一个更容易完成。我不得不在第15步和第16步之间单击“完全控制”复选框,但除此之外,是的,这在我的Windows 7机器上工作,与其他解决方案相比,它的黑客行为要小得多。当队列由Windows服务创建时,这不起作用,因为对队列的访问被拒绝,这正是原始问题中描述的情况。这是更明显的方法,但在没有人对队列授予“设置权限”的情况下不起作用,或者可能只有系统帐户或网络服务帐户具有该权限。如果是这样的话,那么就需要“黑客”了。我已经验证了这个方法在WindowsServer2008R2上有效:)谢谢这听起来像是一个可怕的黑客。当然,这可以通过队列的属性来完成,如下面的回答所述。用于查看队列属性的UI不可用,因为服务将不会启动。。。这是因为我的一个队列处于不一致的状态。这是我唯一的出路。让我查一查。