gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:33:58 34 4
gpt4 key购买 nike

我正在运行一个 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 服务和客户端应用程序的代码,因此我可以根据需要进行更改。但到目前为止,我非常确信绑定(bind)、契约(Contract)和地址都是正确的(因为从桌面运行时一切都运行良好)。我相信问题一定出在从 GPO 运行的客户端应用程序上。但我想不出任何会导致此错误的原因。

更新:

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

A named pipe is an object in the Windows operating system kernel, such as a section of shared memory that processes can use for communication. A named pipe has a name, and can be used for one-way or duplex communication between processes on a single machine.

When communication is required between different WCF applications on a single computer, and you want to prevent any communication from another machine, then use the named pipes transport. An additional restriction is that processes running from Windows Remote Desktop may be restricted to the same Windows Remote Desktop session unless they have elevated privileges.

( Choosing a Transport ,强调已添加)

我需要客户端进程在(非特权)用户的上下文中运行,并且弹出 UAC 对话框不是一个选项。无论如何,我是否可以在保持进程在用户上下文中运行而不让用户享有特权的同时,为该客户端进程提供更高的特权?

更新 #2:

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

最佳答案

The mechanism by which WCF clients find WCF service NetNamedPipe endpoints涉及一个内核共享内存对象,服务使用该对象告诉客户端要使用的管道的实际名称。如果客户端要与服务器进行不同的登录 session ,则此共享内存对象必须位于全局而非本地内核命名空间中。命名管道本身有一个命名空间,对所有客户端可见。您无法直接控制 WCF 用于共享内存对象的命名空间,但如果您的服务器是使用 SeCreateGlobalPrivilege 运行的 Windows 服务,它将是全局内核命名空间。你的问题似乎暗示是这种情况,所以我怀疑你的问题是否与内核对象命名空间有关。

另外两个可能的原因是:

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

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

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

关于c# - 在 C# 中使用 NetNamedPipeBinding 获取 EndpointNotFoundException;需要创建全局命名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477813/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com