5

我正在运行一个 Windows 服务,我通过 NetNamedPipeBinding 向该服务发送消息。消息从由 GPO 触发的客户端应用程序发送。我刚刚在新服务器上安装了服务和客户端,我收到以下消息:

System.ServiceModel.EndpointNotFoundException: 
There was no endpoint listening at 
net.pipe://localhost/VOXAServices/VOXADefaultPipe that could accept the
message. This is often caused by an incorrect address or SOAP action.
See InnerException, if present, for more details.

没有内在的例外。如果我通过双击桌面上的图标来运行客户端应用程序,它就可以正常运行。我管理 Windows 服务和客户端应用程序的代码,因此我可以更改我需要的任何内容。但到目前为止,我非常确信绑定、合同和地址都是正确的(因为从桌面运行时一切都运行良好)。我相信问题一定出在从 GPO 运行的客户端应用程序上。但我想不出任何原因会导致此错误。

更新:

我在微软的网站上读到了这个:

命名管道是 Windows 操作系统内核中的一个对象,例如进程可用于通信的共享内存部分。命名管道有一个名称,可用于单机进程之间的单向或双工通信。

如果需要在单台计算机上的不同 WCF 应用程序之间进行通信,并且您希望阻止来自另一台计算机的任何通信,则使用命名管道传输。另一个限制是,从 Windows 远程桌面运行的进程可能会被限制在同一个 Windows 远程桌面会话中,除非它们具有提升的权限。

选择运输,重点补充)

我需要客户端进程在(非特权)用户的上下文中运行,并且弹出 UAC 对话框不是一个选项。无论如何,我是否可以赋予此客户端进程提升的权限,同时保持该进程在用户上下文中运行并且不使用户具有特权?

更新#2:

似乎存在全局和本地(对于 Windows 会话)命名管道之类的东西。我相信我的 Windows 服务正在创建一个本地命名管道,如果我可以强制它创建一个全局命名管道,它将解决我的问题。(这解释了为什么我在 sysinternals“进程资源管理器”中看不到我的管道,即使我的客户端应用程序可以在我从特权会话中启动它时找到它)。问题是,我不知道(而且似乎无法找出)如何强制全局创建命名管道(c#)。有任何想法吗?

4

1 回答 1

4

WCF 客户端查找 WCF 服务 NetNamedPipe 端点的机制涉及一个内核共享内存对象,服务使用该对象告诉客户端要使用的管道的实际名称。如果客户端将与服务器处于不同的登录会话中,则此共享内存对象必须位于 Global 而不是 Local 内核名称空间中。命名管道本身有一个命名空间,对所有客户端可见。您不能直接控制 WCF 用于共享内存对象的命名空间,但如果您的服务器是使用 SeCreateGlobalPrivilege 运行的 Windows 服务,它将是全局内核命名空间。您的问题似乎暗示就是这种情况,所以我怀疑您的问题是否与内核对象名称空间有关。

另外两个可能的原因是:

  1. 保护共享内存对象和命名管道的 ACL。这些将始终拒绝访问任何具有 NETWORK USERS 组 (SID S-1-5-2) 成员身份的安全上下文。这强制 WCF 保证不远程访问命名管道端点。

  2. 如果您在 Vista 或更高版本上运行,则客户端进程的强制完整性级别不得低于内核对象的强制完整性级别(这将是隐含级别 - 中 - 除非您已采取特殊步骤来提升使用强制诚信标签)

我对 GPO 启动的客户端进程运行的安全上下文知之甚少,无法提供进一步建议,但我建议您检查这两种可能性,并相应地对您的问题发布进一步的更新。

于 2011-09-27T16:57:22.850 回答