c# NetNamedPipeBinding获取EndpointNotFoundException需要创建全局命名管道

本文关键字:全局 管道 创建 NetNamedPipeBinding 获取 EndpointNotFoundException | 更新日期: 2023-09-27 18:09:08

我正在运行一个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#)。什么好主意吗?

c# NetNamedPipeBinding获取EndpointNotFoundException需要创建全局命名管道

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

其他两个可能的原因是:

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

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

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