2017-07-06 1 views
0

J'essaie de créer une file d'attente de messages privée à utiliser avec un service Windows. Je crée la file d'attente dans la classe ProjectInstaller de mon service. Dans le constructeur de ladite classe, je crée un objet MessageQueueInstaller, et l'ajouter à ma propriété Installer.Installers locale comme ceci:Impossible de définir les autorisations de la file d'attente de messages MSMQ à l'aide de MessageQueueInstaller

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); 

Comme j'attends des informations d'identification à passer lorsque le service est installé, et je veux que le compte le service est exécuté sous d'avoir accès à la file d'attente des messages en cours de création, je vous abonnant à l'événement AfterInstall de mon ServiceProcessInstaller afin de saisir le nom d'utilisateur comme ceci:

_serviceProcessInstaller.AfterInstall += (sender, args) => 
{ 
    _q.Permissions = new AccessControlList() 
    { 
     new AccessControlEntry(new Trustee(_serviceProcessInstaller.Username, null, TrusteeType.User), 
      GenericAccessRights.All, StandardAccessRights.All, AccessControlEntryType.Allow) 
    }; 
}; 

Ce processus se termine avec succès, et une ACL entrée est ajouté à l'onglet de sécurité de ma file d'attente privée avec les valeurs attendues Cependant, lors de l'exécution du service qui a besoin d'interagir avec MSMQ, je reçois l'erreur suivante:

Access to Message Queuing system is denied

Bizarrement, si je crée manuellement le exactement la même entrée ACL de l'onglet de sécurité de la file d'attente, tout fonctionne comme par magie ! En outre, si je crée toutes les listes de contrôle d'accès par programmation (se terminant par l'erreur ci-dessus) et puis définissez «Tout le monde» pour un contrôle total manuellement, cela fonctionne également, mais en réglant «Tout le monde» sur Contrôle total pendant la même opération. processus où nous définissons le compte réel ne fonctionne pas. Enfin, j'exécute le service MSMQ sous 'NT AUTHORITY \ Network Service'. J'ai aussi essayé d'ajouter ce compte avec un contrôle total par programme (apparaît comme si toutes les perms sont définies, mais même erreur encore reçue), et j'ai également essayé d'exécuter le service MSMQ comme système local en vain. Je ne suis honnêtement pas sûr de ce qu'il faut faire de cela.

Autant que je sache, les permissions sont identiques, qu'elles aient été ajoutées par programmation ou manuellement, mais de toute évidence ce n'est pas vrai ou cela fonctionnerait.

Que puis-je manquer ici?

Faites-moi savoir si un contexte supplémentaire est nécessaire. Merci!

Répondre

1

Nous utilisons le code suivant pour créer des files d'attente MSMQ et définir les autorisations. Cela fonctionne bien:

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

Eh bien cela fonctionne. J'adorerais savoir pourquoi il semble fonctionner avec 'MessageQueueInstaller', mais ne le fait pas, mais au moins cela me permet de surmonter ce problème. Merci! –