将FullControll授予与当前主机相关的MSMQ队列

时间:2013-01-07 14:11:03

标签: nservicebus

在我的组织中,我们使用Microsoft TFS部署我们的组件。 NServiceBus组件由BuildPortal部署为Windows服务。它通常创建自动MSI包并将其部署在目标服务器上。要部署MSI包,构建门户使用服务帐户(Administrator / SuperUser)。 NServiceBusHost将不会使用相同的服务帐户运行,它将使用系统帐户或不同的服务帐户,该帐户在服务器上具有受限制的权限,并且该帐户将不属于管理员组。

简而言之,Host / install命令使用与实际NServiceBusHost执行不同的帐户运行。在安装期间,所有必需的队列都由安装程序创建(使用NServiceBus.Integration配置文件)。现在,问题是,由于队列创建的帐户不同于原始服务帐户,因此会抛出以下错误。

Message:Could not create queue error@xxxxxxx01 or check its existence. Processing will still continue. 
NServiceBus.Utils.MsmqUtilities.CreateQueueIfNecessary(:0) 
System.Messaging.MessageQueueException (0x80004005): Access to Message Queuing system is denied. 
at System.Messaging.MessageQueue.SetPermissions(AccessControlList dacl) 
at NServiceBus.Utils.MsmqUtilities.SetPermissionsForQueue(String queue, String account) 
at NServiceBus.Utils.MsmqUtilities.CreateQueueIfNecessary(Address address, String account)

要解决上述错误,我们尝试使用INeedToInstallSomething。但是,没有关于如何在Install()方法中使用或使用什么的适当文档/示例。当我们调用 Configure.Instance.ForInstallationOn()。Install()时,安装程​​序不会按预期创建队列。我们想要的只是获取当前安装程序的依赖队列列表。设置这样的权限>> messageQueue.SetPermissions(serviceAccount,MessageQueueAccessRights.FullControl)

是否可以获取当前主机的所有相关队列,并仅在主机安装期间分配权限。

注:

  • 我们暂时不希望将此逻辑移出主机。是, 有一个简单的PSS可能有助于解决这个问题。
  • 我们必须使用受限制的帐户来运行无法成为管理员的主机。

1 个答案:

答案 0 :(得分:0)

我会尝试INeedToInstallInfrastructure<T>并在那里设置权限,或者这可能就像使用IWantToRunBeforeConfigurationIsFinalized的perf计数器一样。您可能需要后者,我不确定INeedToInstallInfrastructure<T>使用的是什么顺序。