【问题标题】:Creating a MSMQ programmatically using .NET使用 .NET 以编程方式创建 MSMQ
【发布时间】:2011-01-31 14:07:53
【问题描述】:

在 Win 2008 R2 机器上运行。

作为自动化我的应用程序安装过程的一部分,我创建了一个小型命令行实用程序,当调用它时会创建一个 MQ。由于我的部署是在工作组环境中,我正在设置创建的队列权限,以便所有人和匿名用户都可以完全控制队列。

我的代码是这样的

Try
    Dim Q As MessageQueue = MessageQueue.Create(QueueName)
    Console.WriteLine("Queue created successfully")

    ' Create an AccessControlList.
    Dim list As New AccessControlList()

    'Add the AccessControlEntry to the AccessControlList.
    list.Add(New AccessControlEntry(New Trustee("Everyone"), GenericAccessRights.All, StandardAccessRights.All, AccessControlEntryType.Allow))
    'Add the AccessControlEntry to the AccessControlList.
    list.Add(New AccessControlEntry(New Trustee("ANONYMOUS LOGON"), GenericAccessRights.All, StandardAccessRights.All, AccessControlEntryType.Allow))

    ' Apply the AccessControlList to the queue.
      Q.SetPermissions(list)

Catch ex As Exception
    Console.WriteLine(String.Format("Unable to create queue {1}. {0}", ex, QueueName))

End Try

当我使用“.\Private$\QueueName”之类的队列名称运行它时,队列创建成功,如果我查看队列权限,一切似乎都正常(所有人和匿名都可以完全访问队列)。问题是权限看起来不错,但事实并非如此。当匿名用户尝试向队列发送(或读取)消息时,他会收到拒绝访问错误。如果在队列权限上我删除了所有人和匿名权限并重新创建它们,那么突然一切都按预期工作并且客户端可以发送消息。

进一步证明存在一些问题:如果我查看文件夹 c:\Windows\Sysnative\msmq\storage\lqs\ 上的队列设置文件的内容,我会看到这些权限

安全= 010007806800000084000000000000001400000002005400030000000000140024001f100101000000000001000000000000140004001f10010100000000000507000000000024003f000f0001050000000000051500000097fd4a8271ec5457708be3d5f401000001050000000000051500000097fd4a8271ec5457708be3d5f401000001050000000000051500000097fd4a8271ec5457708be3d501020000 P>

在删除并重新创建权限后,我得到了这些安全设置:

安全= 01000780680000008400000000000000140000000200540003000000000024003f000f0001050000000000051500000097fd4a8271ec5457708be3d5f4010000000014003f000f00010100000000000507000000000014003f000f0001010000000000010000000001050000000000051500000097fd4a8271ec5457708be3d5f401000001050000000000051500000097fd4a8271ec5457708be3d501020000 P>

在使用上述代码创建的每个队列上,安全设置就像我重新创建设置之前的第一个安全行,之后的第二个安全行。

我在这里错过了什么?

P.S 您可以在我就该主题发表的 MS 论坛帖子中阅读一位前 MSFT 员工对该安全令牌所做的一些分析 http://social.msdn.microsoft.com/Forums/en-US/msmq/thread/2f87fe8a-c452-432a-815d-05eeaf455514/

【问题讨论】:

  • 我的代码包含建议答案的 cmets 中提到的两种方法。他们都没有工作。

标签: .net msmq


【解决方案1】:

您看过 System.Messaging.MessageQueueInstaller 类吗?它由 installutil 调用。基本上,您在其上设置一堆属性(队列名称、权限、如果它是事务性的、启用日志等),然后让它完成所有工作。既然已经建好了,你可以试试这条路线。

【讨论】:

  • 我使用 .net 反射器查看了 MessageQueueInstaller,但它的作用与我完全相同。问题出在 MSMQ 或与 MSMQ 的 .net 接口中,但我不知道在哪里
  • 查看我们的队列安装程序代码,我们使用 MessageQueueAccessControlEntry 而不是 AccessControlEntry 和 MessageQueueAccessRights 而不是 Generic/StandardAccessRights。你试过吗? new MessageQueueAccessControlEntry(new Trustee("NETWORK SERVICE"), MessageQueueAccessRights.PeekMessage | MessageQueueAccessRights.ReceiveMessage | MessageQueueAccessRights.WriteMessage);
  • 这篇文章可能对serializer.blogspot.com/2005/12/…有帮助
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 2016-02-19
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
相关资源
最近更新 更多