2009-04-23 128 views
25

在XP机器上有一个由.net服务创建的私人消息队列。 当我想在VB6应用程序中访问这个专用队列时,我总是收到“Access is denied”错误。 所以这似乎是一个安全问题,只是我不明白为什么即使当我以管理员身份登录时,我仍然无法访问在同一台计算机上创建的队列。 还有什么我不得不考虑的。没有权限访问私人MSMQ

我如何使用队列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 
+0

您是否检查过队列的安全性? ACL在队列属性中,看起来就像文件夹属性。 – 2009-04-23 13:11:41

+0

如果我尝试修改队列的属性,我只会收到“访问被拒绝”的消息。 – Mez 2009-04-23 18:13:22

回答

52

如果.NET服务从权限私人队列中删除了“Everyone”组会发生这种情况样品。这里有一些步骤,你可以采取的解决此问题:

  1. 停止MSMQ服务

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

  3. 找到这个文件夹描述你的队列在文件 - (incommingQueue )

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

  5. 找到开始Security=....

  6. 复制整条生产线到剪贴板文件中的行(注意自动换行,该行会相当长)

  7. 公开赛在文本编辑器您的问题队列LQS文件

  8. 覆盖的Security=...线在该文件中与您的剪贴板中的内容

  9. 保存修改的文件LQS

  10. 启动MSMQ服务

您应该发现问题队列现在有相同的权限,其安全设置您在上述步骤6中复制的队列。

+1

这听起来像一个可怕的黑客。 *当然*可以通过队列的属性完成,如下面的答案中所述。 https://stackoverflow.com/a/3138438/1158692 – 2017-06-06 08:26:25

26

这里发布的解决方案似乎有点破解。也许这对于Windows XP是必需的。我遇到过类似Windows 7的东西,并用不同的方法来解决这个问题。

现状:

  • 计划包括创建一个私人事务性队列
  • 程序运行作为Windows服务,在本地系统帐户下运行的C#代码。
  • 运行服务时,将使用本地系统帐户作为所有者创建私有队列。
  • 尽管我是管理员,但我无法检查队列中的消息。

解决方案(这是Windows 7):

  1. 运行COMPMGMT.MSC
  2. 打开 '服务和应用程序'
  3. 打开 '消息队列'
  4. 打开 '专用队列'点击“属性”
  5. 选择 '安全' 标签
  6. 点击 '高级'
  7. 选择 '所有者' 选项卡
  8. 选择 '管理员'
  9. 选择 '权限' 选项卡
  10. 点击 '添加'
  11. 类型以你的名义(例如, “管理员”)
  12. 点击“检查名称”
  13. 点击“确定”
  14. 点击“确定”
  15. 点击“确定”

现在你可以在队列访问消息,也如果您愿意,可以清除队列。