我的团队第一次尝试使用NServiceBus(v2.0),使用MSMQ作为后备存储。我们陷入了队列权限。
我们在Web窗体应用程序中使用它,其中运行网站的用户帐户不是计算机的管理员。
当NServiceBus创建MSMQ队列时,它为本地管理员组提供完全控制权,并为本地所有人和匿名组授予发送消息的权限。
但后来,作为初始化队列的一部分,NServiceBus尝试读取其所有消息。这就是我们遇到权限错误的地方。由于网站未以管理员身份运行,因此不允许阅读邮件。
其他人如何处理此问题?您的应用程序是作为管理员运行或者首先在代码中创建MSMQ队列,为其提供所需的权限,以便NServiceBus不必创建它?或者我们缺少一些配置?或者我们是否可能编写错误地使用NServiceBus的代码来运行它?
答案 0 :(得分:2)
这篇博文应该有所帮助:
特别是:
“如果要在创建队列时设置权限,可以始终构建所需的安全描述符并将其传递到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