在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”的队列名称运行它时,队列成功创建,如果我查看队列权限,所有SEEMS都可以(每个人和匿名者都可以完全访问队列) )。问题是权限似乎没问题,但事实并非如此。当匿名用户尝试向队列发送(或读取)消息时,他会收到拒绝访问错误。如果在队列权限我删除所有人&匿名权限并重新创建它们然后突然一切按预期工作,客户端可以发送消息。
进一步证明存在一些问题:如果我查看文件夹c:\ Windows \ Sysnative \ msmq \ storage \ lqs \对队列设置文件的内容我看到了这些权限
安全= 010007806800000084000000000000001400000002005400030000000000140024001f100101000000000001000000000000140004001f10010100000000000507000000000024003f000f0001050000000000051500000097fd4a8271ec5457708be3d5f401000001050000000000051500000097fd4a8271ec5457708be3d5f401000001050000000000051500000097fd4a8271ec5457708be3d501020000
在删除并重新创建权限后,我获得了以下安全设置:
安全= 01000780680000008400000000000000140000000200540003000000000024003f000f0001050000000000051500000097fd4a8271ec5457708be3d5f4010000000014003f000f00010100000000000507000000000014003f000f0001010000000000010000000001050000000000051500000097fd4a8271ec5457708be3d5f401000001050000000000051500000097fd4a8271ec5457708be3d501020000
使用安全设置上方的代码创建的每个队列上的就像我重新创建设置之前的第一个安全行,就像之后的第二个安全行一样。
我在这里错过了什么?
P.S你可以阅读前MSFT员工在关于这个主题的MS论坛帖子上做的这个安全令牌的一些分析 http://social.msdn.microsoft.com/Forums/en-US/msmq/thread/2f87fe8a-c452-432a-815d-05eeaf455514/
答案 0 :(得分:1)
您是否查看了System.Messaging.MessageQueueInstaller类?它由installutil调用。基本上,你在它上面设置了一堆属性(队列名称,权限,如果它是事务性的,启用了日志等),然后让它完成所有工作。由于它已经建成,你可以试试这条路线。