在C#中使用NetNamedPipeBinding获取EndpointNotFoundException; 需要创建全局命名管道

Tre*_*vor 5 c# netnamedpipebinding

我正在运行一个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.
Run Code Online (Sandbox Code Playgroud)

没有内在的例外.如果我通过双击桌面上的图标运行客户端应用程序,它运行没有问题.我管理Windows服务和客户端应用程序的代码,所以我可以改变我需要的任何东西.但到目前为止,我非常确信绑定,合同和地址都是正确的(因为从桌面运行时一切运行正常).我认为问题必须是从GPO运行客户端应用程序.但我想不出有什么理由会导致这个错误.

更新:

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

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

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

(选择运输,增加重点)

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

更新#2:

似乎存在全局和本地(对于Windows会话)命名管道这样的事情.我相信我的Windows服务正在创建一个本地命名管道,如果我可以强制它创建一个全局命名管道,它将解决我的问题.(这解释了为什么我在sysinternals"Process Explorer"中看不到我的管道,即使我的客户端应用程序可以找到它,如果我从特权会话启动它).问题是,我不知道(并且似乎无法找到)如何强制全局创建命名管道(c#).有任何想法吗?

Chr*_*son 4

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

另外两个可能的原因是:

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

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

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