J'ai une application qui utilise MSMQ et qui fonctionne très bien lorsque le producteur et le consommateur sont sur la même machine.
Hier, pour la première fois, j'ai essayé de créer un autre producteur qui s'exécuterait sur une machine séparée. La file d'attente est une file d'attente privée, et avant, les deux côtés la référençaient comme
string strQueueName = ".\Private$\MyQueue";
J'ai essayé plusieurs façons de référencer cette file d'attente à partir de la machine distante. Mon nom de serveur est "groucho", donc j'ai essayé
string strQueueName = "groucho\Private$\MyQueue";
mais cela a systématiquement généré une exception "nom de chemin de file d'attente non valide".
Un collègue développeur m'a suggéré d'essayer ce qui suit, ce qui évite l'exception :
string strQueueName = "FORMATNAME:DIRECT =OS:grouch\\private$\\SDVQueue";
Cela ne génère plus l'exception, mais cela ne semble pas fonctionner non plus, car je ne vois pas les messages dans la file d'attente.
Le serveur est Windows Server 2008 R2. La file d'attente est configurée (je viens de le remarquer) de sorte que "Everyone" peut Recevoir et Examiner, mais pas Envoyer, mais lorsque j'essaie d'ajouter "Envoyer", j'obtiens une boîte de dialogue d'erreur qui dit "Le descripteur de sécurité ne peut pas être défini, Erreur : Accès refusé". J'ai bien des privilèges d'administrateur sur cette machine.
Je sais, d'après la lecture d'autres publications, qu'il y a toutes sortes de problèmes de sécurité en jeu, mais je ne vois aucune erreur dans les journaux d'événements sur l'expéditeur ou la machine hôte.
S'il s'agit d'un problème de sécurité, comment puis-je voir quel est le problème?
Merci!
Voici le code de test complet :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Messaging;
namespace RemoteQueue
{
class Program
{
static void Main(string[] args)
{
string name = "FORMATNAME:DIRECT =OS:groucho\\private$\\SDVQueue";;
string input = null;
MessageQueue queue = null;
try
{
queue = new MessageQueue(name);
string key = "key";
for (int i = 0; i < 200; i++)
{
Message msgToSend = new Message();
string value = "value_" + i;
msgToSend.Body = string.Format("{0},{1}", key, value);
Console.WriteLine("Envoyer le message " + i);
queue.Send(msgToSend, "otherpart");
}
}
catch (MessageQueueException me)
{
Console.WriteLine("ERREUR : exception de file d'attente de message capturée : " + me.Message);
}
Console.WriteLine("Tapez une touche pour quitter...");
input = Console.ReadLine();
}
}
}