无法使用MessageQueueInstaller设置MSMQ消息队列权限
我正在尝试创建一个专用消息队列以用于Windows服务。我在服务的ProjectInstaller
类中创建队列。在构造函数中说类,我创建了一个MessageQueueInstaller
对象,并将其添加到我的本地Installer.Installers
属性,像这样:无法使用MessageQueueInstaller设置MSMQ消息队列权限
var path = _config?.Settings[QUEUE_PATH]?.Value;
if (string.IsNullOrEmpty(path))
{
Console.WriteLine($"Could not install MSMQ message queue. Cannot install service. Missing private queue path value.");
throw new ArgumentNullException(QUEUE_PATH, "Cannot create private message queue with null queue path.");
}
_q = new MessageQueueInstaller();
_q.Label = "Queue Name";
_q.Path = path;
_q.Transactional = true;
Installers.Add(_q);
因为我希望凭据安装服务时中过去了,我想账户服务下运行以充分获得所创建的消息队列,我订阅了AfterInstall
事件我ServiceProcessInstaller
的为了抢,像这样的用户名:
_serviceProcessInstaller.AfterInstall += (sender, args) =>
{
_q.Permissions = new AccessControlList()
{
new AccessControlEntry(new Trustee(_serviceProcessInstaller.Username, null, TrusteeType.User),
GenericAccessRights.All, StandardAccessRights.All, AccessControlEntryType.Allow)
};
};
这个过程成功完成,以及ACL条目添加到我的私人队列的安全选项卡与期望值然而,运行需要与MSMQ交互服务时,我收到以下错误:
Access to Message Queuing system is denied
奇怪的是,如果我手动创建一个从队列中的安全选项卡中的完全相同的ACL条目,一切都奇迹般地工程!如果我以编程方式创建所有ACL(最后出现上述错误),并且然后手动将'Everyone'设置为完全控制,它也可以工作,但在相同期间将'Everyone'设置为完全控制过程中我们设置的实际账户不是工作。
最后,我正在'NT AUTHORITY \ Network Service'下运行MSMQ服务。我有也试图以编程方式添加该帐户与完全控制(看起来好像所有的烫发设置,但仍然收到相同的错误),我也尝试运行MSMQ服务作为本地系统无济于事。
我真的不知道该怎么做。据我所知,权限是相同的,无论它们是以编程方式还是手动方式添加的,但显然这不是真的,或者这是行得通的。
我在这里错过了什么?
请让我知道是否需要额外的上下文。谢谢!
我们使用下面的代码来创建MSMQ队列并设置权限。它工作得很好:
public void CreateQueueIfNotExists(string queueName, List<string> users)
{
if (!MessageQueue.Exists(queueName))
{
MessageQueue.Create(queueName);
var queue = new MessageQueue(queueName);
//set permissions for those users
foreach (var user in users)
{
queue.SetPermissions(user, MessageQueueAccessRights.ReceiveMessage | MessageQueueAccessRights.WriteMessage, AccessControlEntryType.Allow);
}
}
}
嗯,这个作品。想知道为什么它使用'MessageQueueInstaller',但实际上没有,但至少这让我通过这个问题。谢谢! –