无法使用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); 
     } 
    } 
} 
+0

嗯,这个作品。想知道为什么它使用'MessageQueueInstaller',但实际上没有,但至少这让我通过这个问题。谢谢! –