代码之家  ›  专栏  ›  技术社区  ›  HappyNomad

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

  •  5
  • HappyNomad  · 技术社区  · 14 年前

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

    System.ServiceModel.CommunicationException:无法连接到终结点“net.pipe://localhost/MyApp.MyID”。--gt;Syt.Io.PiPeExpect:“\\管道…GUID…”存在一个管道端点,但连接失败:访问被拒绝。(5,0×5)

    在受保护模式下运行外接程序是我必须支持的方案。我的理解是,如果我降低命名管道的完整性级别,那么我的IE插件将被允许通过它进行对话。我的问题是怎么做。我有东西设置使用WCF,最好保持这样。我可以让WCF创建完整性级别较低的命名管道吗?我应该编写什么代码来实现这一点?

    1 回复  |  直到 14 年前
        1
  •  7
  •   Community Romance    7 年前

    我不认为这是可能的。

    CreateNamedPipe 发生在私人房间里 CreatePipe() System.ServiceModel.Channels.PipeConnectionListener . 我看不到更改它如何指定管道的初始安全描述符的方法。

    this question and answer 我们需要达到的目标。

    从头开始编写一个名为pipe transport binding的自定义元素似乎是目前解决此问题的唯一方法,如果失败,我们将不得不等待微软在未来版本的WCF中添加一些启用功能。如果您有权访问Microsoft Connect,则可以 add your voice to the others requesting this feature

    编辑: 我太悲观了。我现在找到了一个办法。

    dwOpenMode 将参数标记为 重载使用其中一个位表示两个 FILE_FLAG_FIRST_PIPE_INSTANCE WRITE_OWNER . 我们需要后者的访问权限才能添加完整性标签,但是前者的存在会导致除了第一个管道实例以外的任何管道实例上的调用失败。

    System.ServiceModel.Channels.PipeConnectionListener.PendingAccept ,存储在由管道连接侦听器维护的列表中。连接侦听器与通道侦听器不同(可以通过重写 BuildChannelListener<> 一个绑定元素的方法),而且很难获得。它涉及到使用反射的英勇行为,定位端点的TransportManager(它保存对端点的连接侦听器的引用),然后向下处理连接侦听器链(根据跟踪等的配置而变化),直到找到管道连接侦听器。如果幸运的话,第一个管道句柄可以在侦听器的挂起接受列表中找到(尽管这里有一个竞争条件-如果客户端在我们获得句柄之前连接,它将永远消失)。

    一旦句柄可用,降低完整性以允许低完整性客户端与服务通信只是调用 SetSecurityInfo

    我打算把这件事详细地讲一下 my blog