NServiceBus& MSMQ:如何更改队列上的默认权限?

时间:2010-05-21 10:15:30

标签: msmq nservicebus

我的团队第一次尝试使用NServiceBus(v2.0),使用MSMQ作为后备存储。我们陷入了队列权限。

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

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

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

其他人如何处理此问题?您的应用程序是作为管理员运行或者首先在代码中创建MSMQ队列,为其提供所需的权限,以便NServiceBus不必创建它?或者我们缺少一些配置?或者我们是否可能编写错误地使用NServiceBus的代码来运行它?

4 个答案:

答案 0 :(得分:2)

这篇博文应该有所帮助:

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

特别是:

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

干杯
John Breakwell(前MSFT)

答案 1 :(得分:1)

我们在Installer子类中创建队列,并在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的队列自动创建功能更适合开发,而不是部署。

答案 2 :(得分:0)

更改队列的所有权,这是在类似情况下唯一对我有用的东西

答案 3 :(得分:0)

要获取MSMQ队列创建的完全所有权,您可以禁用installers,然后自己处理creation of queues