2010-05-21 64 views
1

我的团队首次尝试使用NServiceBus(v2.0),使用MSMQ作为后备存储。我们遇到了队列权限问题。NServiceBus&MSMQ:如何更改队列上的默认权限?

我们正在Web窗体应用程序中使用它,其中网站运行的用户帐户不是机器上的管理员。

当NServiceBus创建MSMQ队列时,它给予本地管理员组完全控制,并且本地所有人和匿名组发送消息的权限。

但后来,作为初始化队列的一部分,NServiceBus尝试读取其所有消息。这就是我们遇到权限错误的地方。由于该网站没有以管理员身份运行,因此不允许阅读邮件。

其他人如何处理这个问题?你的应用程序以管理员身份运行吗或者,您是否先在您的代码中创建MSMQ队列,并为其提供所需的权限,以便NServiceBus不必创建它?还是有一些我们错过的配置?或者,我们是否可能编写使用NServiceBus错误地运行的代码?队列

回答

1

我们在安装程序子类中创建队列和执行它作为MSI安装的一部分。队列的所有权是一条捷径,但相关权限可以通过AccessControlList设置:

MessageQueue queue = MessageQueue.Create(queueName, true); 
AccessControlList permissions = new AccessControlList(); 
permissions.Add(new MessageQueueAccessControlEntry(
    new Trustee(this.serviceProcessInstaller.Username), 
    MessageQueueAccessRights.FullControl, 
    AccessControlEntryType.Set)); 
// Add additional permissions for admins & message-sending accounts 
queue.SetPermissions(permissions); 

我觉得NServiceBus的队列中自动创建功能更适合于发展,而不是部署。

+0

是的,我最终听到类似的NServiceBus组:http:// tech .groups.yahoo。COM /组/ nservicebus /消息/ 7391。自动创建队列是为了开发,而不是生产,环境,我们应该自己创建队列并为其提供我们需要的权限。 – 2010-05-25 08:11:31

+0

从3.0版开始,我们引入了一个更明确的安装步骤来处理整个权限问题。 – 2012-03-20 08:14:39

+0

Udi,你能否提供一个链接到正确处理3.0版本的步骤的文档? – BlackICE 2013-08-27 20:27:18

0

改变所有权,它只是在类似的情况为我工作的事情

+0

你的意思是我们应该做的是编程? – 2010-05-21 11:27:57

2

本博客文章应该有所帮助:

http://blogs.msdn.com/johnbreakwell/archive/2009/08/03/default-msmq-queue-permissions-have-changed-in-msmq-4-0.aspx

特别:

“如果你想要在创建队列时设置权限,可以始终创建所需的安全描述符并将其传递到MQCreateQueue的pSecurityDescriptor参数中。但是,您不能自定义默认设置,因为它们是硬编码“。

干杯
约翰Breakwell(EX-MSFT)

+0

有趣。实际上,我们在一些较早的代码中设置了我们自己的自定义权限,这些代码是创建队列的代码。不过现在,问题在于我们让NServiceBus为我们创建队列,而且我找不到一种方法使它创建NServiceBus默认值以外的权限的队列。在开始尝试将它与NServiceBus一起使用之前,我开始倾向于确保队列具有正确的权限。 – 2010-05-21 14:43:17

+0

是的,这绝对是你想要的方法。让NServiceBus为你自动创建队列在某些情况下可用于开发,可能永远不会用于部署到生产。查看:[http://stackoverflow.com/questions/4810164/nservicebus-how-to-not-create-queues-automatically] – Adam 2011-09-01 14:44:49