c# - 如何降低 WCF 命名管道的完整性

标签 c# wcf named-pipes bho protected-mode

我有一个用 C# 编写的 Internet Explorer 加载项,它通过 WCF 命名管道与 .NET 桌面应用程序通信。桌面应用程序为 netNamedPipeBinding 创建 ServiceHost,IE 加载项的每个实例都创建一个 ChannelFactory 来与应用程序对话。在Windows XP下一切正常,但在Windows 7下IE的保护模式下会抛出异常。

System.ServiceModel.CommunicationException:无法连接到端点“net.pipe://localhost/MyApp.MyID”。 ---> System.IO.PipeException: '\.\pipe...guid...' 存在管道端点,但连接失败:访问被拒绝。 (5, 0x5)

在保护模式下运行加载项是我必须支持的场景。我的理解是,如果我降低命名管道的完整性级别,那么我的 IE 加载项将被允许通过它进行对话。我的问题是如何做到这一点。我有使用 WCF 的设置,并且最好保持这种状态。我可以让 WCF 创建具有较低完整性级别的命名管道吗?我要编写什么代码来实现这一点?

最佳答案

我不认为这是可能的。

问题是必须在创建命名管道时提供的安全描述符中指定完整性标签。在标准的 NetNamedPipeBinding 中,对 CreateNamedPipe 的调用发生在私有(private)内部 CreatePipe()内部 WCF 类的方法 System.ServiceModel.Channels.PipeConnectionListener .我看不出有什么方法可以更改它指定管道初始安全描述符的方式。

参见 this question and answer概述我们需要实现的目标。

从头开始编写自定义命名管道传输绑定(bind)元素似乎是目前解决此问题的唯一方法,否则我们只能等待 Microsoft 在 WCF 的 future 版本中添加一些启用功能。如果您有权访问 Microsoft Connect,您可以 add your voice to the others requesting this feature .

编辑: 我太悲观了。我现在找到了一种方法来做到这一点。

关键是事实证明,创建管道时您不必在安全描述符中指定完整性标签 - 但您必须在打开监听器时使用从 CreateNamedPipe 返回的句柄修改 SACL - 即管道的第一个服务器端句柄。使用任何其他句柄,尝试添加完整性标签总是失败,因为 dwOpenMode将参数标记为 CreateNamedPipe重载使用其中一个位来表示 FILE_FLAG_FIRST_PIPE_INSTANCEWRITE_OWNER .我们需要后者的访问权限才能添加完整性标签,但前者的存在会导致除第一个管道实异常(exception)的任何调用都失败。

获得第一个管柄并非易事。 WCF 在 System.ServiceModel.Channels.PipeConnectionListener.PendingAccept 类型的实例中将其存储起来,存储在由管道连接监听器维护的列表中。连接监听器与 channel 监听器不同(可以通过覆盖绑定(bind)元素的 BuildChannelListener<> 方法直接获取),而且更难获得。它涉及使用反射的英勇行为,定位端点的 TransportManager,它保存对端点连接监听器的引用,然后沿着连接监听器链(根据跟踪等配置而变化)进行处理,直到找到管道连接监听器.如果幸运的话,第一个管道句柄可以在监听器的待定接受列表中找到(尽管这里存在竞争条件 - 如果客户端在我们获得句柄之前连接,它将永远消失)。

一旦句柄可用,降低完整性以允许低完整性客户端与服务通信只是调用 SetSecurityInfo 的问题在 handle 上添加完整性标签。

我计划在 my blog 上介绍这是一些细节很快。

关于c# - 如何降低 WCF 命名管道的完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064634/

相关文章:

c# - net 2.0中不同类型结构的排序列表

WCF 接收带有 SWA 负载的请求

c# - 修改 DataContractSerializer 的输出 xml

wcf - WCF 的 SSL 不工作!如何调试

c++ - 重叠 IO 和 ERROR_IO_INCOMPLETE

c - 使用管道将文件 i/o 传输到另一个进程

c# - 元素不可点击,另一个元素接收点击 - Selenium C#

c# - 随机 SQL 连接问题。工作,然后不工作,然后工作,然后 BAM!永远不会再工作?

c# - 如何解决无法建立连接,因为目标机器主动拒绝它 127.0.0.1 :64527

c# - SQL Server "Network Path Not Found"跨环境随机且不频繁发生