2 台の Windows Server 2008 R2 仮想マシンで MSMQ 5 を動作させようとしています。ローカルおよびリモートのプライベート キューに送信でき、ローカルのプライベート キューから読み取ることができます。リモート専用キューから読み取ることができません。
私は多くの提案を読みましたが、特に John Breakwell がMSMQ Issue reading remote private queues (again)でまとめたものを読みました。
私がすでに行ったこと:
- 両方のマシンでファイアウォールをオフにしました。
- Everyone と AnonymousLogon がキューを完全に制御できるようにしました。(AnonymousLogon アクセスを奪うと、リモートでキューに送信できなくなり、メッセージは受信側のマシンで「アクセスが拒否されました」と表示されます。)
- 両方のマシンで認証されていない Rpc を許可します。
- 両方のマシンで NewRemoteReadServerAllowNoneSecurityClient を許可しました。
送信コード フラグメントは次のとおりです。
MessageQueue queue = new MessageQueue(queueName, false, false, QueueAccessMode.Send);
Message msg = new Message("Blah");
msg.UseDeadLetterQueue = true;
msg.UseJournalQueue = true;
queue.Send(msg, MessageQueueTransactionType.Automatic);
queue.Close();
受信コード フラグメントは次のとおりです。
queueName = String.Format("FormatName:DIRECT=OS:{0}\\private$\\{1}",host,id);
queue = new MessageQueue(queueName, QueueAccessMode.Receive);
queue.ReceiveCompleted += new ReceiveCompletedEventHandler(receive);
queue.BeginReceive();
...
public void receive(object sender, ReceiveCompletedEventArgs e)
{
queue.EndReceive(e.AsyncResult);
Console.WriteLine("Message received");
queue.BeginReceive();
}
私の queueName は次のようになりますFormatName:DIRECT=OS:server2\private$\TestQueue
キューで beginReceive() を呼び出すと、
Exception: System.Messaging.MessageQueueException (0x80004005)
at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
at System.Messaging.MessageQueue.ReceiveAsync(TimeSpan timeout, CursorHandle cursorHandle, Int32 action, AsyncCallback callback, Object stateObject)
at System.Messaging.MessageQueue.BeginReceive()
Server1 で Wireshark を使用して、ネットワーク トラフィックを調べました。すべての詳細を掲載せずに、次の段階を経ているようです。(Server1 は Server2 のキューから読み取ろうとしています。)
- Server1 が Server2 に接続し、NTLMSSP チャレンジ/レスポンス ネゴシエーションが行われます。いくつかの応答には、「不明な結果 (3)、理由: ローカル制限を超えました」と記載されています。
- Server1 は Server2 に rpc__mgmt_inq_princ_name 要求を送信し、Server2 は対応する応答で応答します。
- ドメインを検索する LDAP 交換がいくつかあり、次に ldap://domain/cn=msmq,CN=Server2,CN=Computers,DC=domain への参照があり、「そのようなオブジェクトはありません」という応答が返されます。
- 次に、LDAP サーバーとの間で暗号化された SASL GSS-API 交換が行われます。
- 次に、ldap サーバーと Server2 への接続が閉じられます。
イベント ビューアー > アプリケーションとサービス ログ > Microsoft > Windows > MSMQ > End2End を有効にしようとしました。メッセージが送信されていることは示されていますが、受信しようとして失敗した理由は示されていません。これをさらにデバッグするにはどうすればよいですか?