在我的组织中,我们使用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)
是否可以获取当前主机的所有相关队列,并仅在主机安装期间分配权限。
注:
答案 0 :(得分:0)
我会尝试INeedToInstallInfrastructure<T>
并在那里设置权限,或者这可能就像使用IWantToRunBeforeConfigurationIsFinalized
的perf计数器一样。您可能需要后者,我不确定INeedToInstallInfrastructure<T>
使用的是什么顺序。