MSMQ问题读取远程私人队列(再次)

Pet*_*r M 8 windows-xp msmq windows-7

好吧,我的问题类似于如何从私人工作组队列接收消息(我基本上使用相同的代码).

我正在使用主机上创建队列

MessageQueue.Create(@".\Private$\MyNewPrivateQueue");
Run Code Online (Sandbox Code Playgroud)

使用打开远程计算机上的队列

var queue = new MessageQueue(@"FormatName:DIRECT=TCP:xxx.xxx.xxx.xxx\PRIVATE$\MyNewPrivateQueue");
Run Code Online (Sandbox Code Playgroud)

使用queue.send()和queue.Receive()编写/读取数据

我有两个系统,我正在尝试.

  1. Windows 7家庭高级版x64
  2. Windows XP SP3

当我在W7系统上创建专用队列并尝试编写然后从XP系统读取队列时(根据引用的问题),它在读取操作上失败并显示"消息队列服务不可用"异常.

然而,当我扭转系统(创建XP系统上的队列和写入/从W7系统中读取,并使用相同的代码),它工作正常.

我经历过:

  1. 从远程队列中读取消息
  2. 了解MSMQ安全性如何阻止RPC流量
  3. 远程从Windows Server 2008获取MSMQ消息
  4. 清除方式 - MSMQ通过
  5. MSMQ 3.0对你来说太安全了吗?

我也尝试关闭W7和XP防火墙,并给予每个人和他的狗对队列本身的完全权限无济于事.

鉴于它可以作为队列主机使用XP,但不能使用W7作为主机,我认为这是一个安全问题,而不是代码问题.但是对于我的生活,我无法看到W7在哪里堵塞.

编辑8/9

好的..添加

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters\Security\AllowNonauthenticatedRPC 
Run Code Online (Sandbox Code Playgroud)

允许我从远程专用队列中读取消息.然而,这似乎不允许使用

GetPrivateQueueByMachine(String machineName)
Run Code Online (Sandbox Code Playgroud)

枚举可用的私有队列.那么这个想法有什么意义吗?

Pet*_*r M 6

好的..我显然没有阅读所有我需要阅读的内容.答案是:

MSMQ 4.0 - 计算机管理有哪些新功能?

我需要添加一个新的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters\Security\AllowNonauthenticatedRPC
Run Code Online (Sandbox Code Playgroud)

并将值设置为1.

一旦我在W7服务器上执行此操作,我就可以从XP机器上读取队列.

我是唯一一个认为这是奇怪的人,任何人都可以写入队列,但我必须将其设置为从队列中读取?那太离奇了.

  • 不,不奇怪.发送到队列和从队列接收使用完全不同的网络协议.MSMQ(和HTTP)协议用于发送/推送消息; RPC协议用于接收/拉取消息.这些协议真的是粉笔和奶酪,有完全不同的麻烦点. (3认同)