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

2023-11-29

我有一个用 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发生在私人内部CreatePipe()内部WCF类的方法System.ServiceModel.Channels.PipeConnectionListener。我看不出有什么方法可以改变它指定管道初始安全描述符的方式。

See 这个问题和答案概述我们需要实现的目标。

从头开始编写自定义命名管道传输绑定元素似乎是目前解决此问题的唯一方法,否则我们只能等待 Microsoft 在 WCF 的未来版本中添加一些支持功能。如果您有权访问 Microsoft Connect,您可以将您的声音添加到请求此功能的其他人中.

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

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

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

一旦句柄可用,只需调用即可降低完整性以允许低完整性客户端与服务进行通信SetSecurityInfo在手柄上添加完整性标签。

我计划介绍这一点的一些细节my blog soon.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何降低 WCF 命名管道的完整性 的相关文章

随机推荐

  • JavaFX(8)警报:不同的按钮尺寸

    考虑一个带有两个按钮的 JavaFX 8 警报对话框 Alert alert new Alert AlertType CONFIRMATION ButtonType bttYes new ButtonType Yes ButtonType
  • AngularJS 中的 404 错误

    你好 我是 AngularJS 的新手 我开始于本教程 在教程中 http get方法正在调用 JSON 文件 就我而言 我总是收到 404 错误 JSON 文件的位置也与 HTML 文件相关 但总是遇到同样的错误 这是我的代码 索引 ht
  • 在同一页面内将变量从 JS 传递到 PHP [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我知道这个问题已经被回答过很多次了 但我正在寻找的是同一页面内变量的传递 我知道PHP是服务器端脚本 而JS是客户端 因此当页面加载时 它将在JS之前加载PHP 因此不可能这样做 我正
  • LINQ to XML:查询正文必须以 select 子句或 group 子句结尾

    有人可以指导我修复此查询的错误 var objApps from item in xDoc Descendants VHost where from x in item Descendants Application select new
  • 不变是什么意思?

    如果字符串是不可变的 这是否意味着 我们假设是 JavaScript var str foo alert str substr 1 oo alert str foo 这是否意味着 当对字符串调用方法时 它将返回修改后的字符串 但不会更改初始
  • TensorFlowdynamic_rnn状态

    我的问题是关于 TensorFlow 方法tf nn dynamic rnn 它返回每个时间步的输出和最终状态 我想知道返回的最终状态是否是最大序列长度下的单元状态 或者是否由sequence length争论 为了更好地理解一个例子 我有
  • MongoDB:使用变量进行文本搜索(精确匹配)

    MongoDB 3 4我有一个变量值 val1 小堡垒 我需要在集合存储中搜索 名称字段上有文本索引 文档为 db stores insert id 1 name Java Hut description Coffee and cakes
  • 如何检查 Receiver 是否在 Android 中注册?

    我需要检查我注册的接收者是否仍然注册 如果没有 我该如何检查它 没有 API 函数来检查接收者是否已注册 解决方法是将您的代码放在try catch block as done below try Register or UnRegiste
  • 如何提供 Google 地图实例的屏幕截图?

    我想实现一个与此类似的地图 http gmaps utility library googlecode com svn trunk markerclusterer 1 0 examples advanced example html 所需的
  • 尝试从 PGAdmin 导入 CSV 文件时权限被拒绝

    我正在使用 PGAdmin 1 14 3 当我尝试执行导入命令时 COPY grad country code postal code place name admin name1 admin code1 admin name2 admin
  • 使用 iTextSharp 更改 PDF 的字体

    如何在 C 中使用 iTextSharp 更改现有 PDF 文件的字体 我想将整个文档的字体更改为一种 例如宋体 最后我解决了这个问题 下面的代码将打开一个现有的 Pdf 文件 并按照我的预期将其所有字体更改为 盲文 private sta
  • ActiveRecord::AssociationTypeMismatch in Controller#create on dropdown select for a Rails self join

    我在 Rails 5 中自我加入时遇到 ActiveRecord AssociationTypeMismatch 错误 我不知道如何修复 这是一个简单的 Rails 应用程序 用户可以在其中分享艺术家 例如 David Bowie 对另一位
  • 使用先前的列名称填充空标题 - pandas

    我有一个数据框 其中每个第二列名称都会被跳过 eg 步骤1 这个想法是用以前的名称填充未命名的列以获得 第2步 总结每堂课的 进 和 出 得到这样的最终结果 中间的Step 1很重要 不能跳过才能得到最终结果 我感谢您的帮助 并对第一次尝试
  • React Native - Native Base 页脚不改变颜色

    这是代码 Bottom js
  • 如何将 float[][] 类型数组转换为“emxArray_real_T *x”

    我已经使用 MatlabCoder 转换了一个函数 该函数以 NxN 矩阵作为输入 并给出从 matlab 到 C 的 NxN 矩阵输出 它给了我一个有两个参数的函数 即 void func const emxArray real T x
  • 如何将r中的因子水平转换为整数

    我在 R 中有以下数据框 ID Season Year Weekday 1 Winter 2017 Monday 2 Winter 2018 Tuesday 3 Summer 2017 Monday 4 Summer 2018 Wednsd
  • 为什么 C 没有无符号浮点数?

    我知道 这个问题似乎很奇怪 程序员有时想得太多了 请继续阅读 在C中我使用signed and unsigned整数很多 我喜欢这样一个事实 如果我执行诸如将有符号整数分配给无符号变量之类的操作 编译器会发出警告 如果我比较有符号整数和无符
  • django中的复合主键

    我有一个具有复合主键的旧数据库表 我认为我无法更改结构以包含代理键 因为编写了一些使用该表的代码 在 django 中 我无法使用该表 因为它没有主键 非复合 django 模型支持复合主键吗 如果没有 是否有在不改变表结构的情况下的解决方
  • 存档的 Meteor 文档

    有谁知道在哪里可以找到过去版本的 MeteorJS 文档 该网站上似乎没有像其他文档网站那样切换到旧版本的选项 您可以下载所需版本的标签并在 docs 目录中运行该应用程序 docs 目录是一个meteor 应用程序 您需要做的就是mete
  • 如何降低 WCF 命名管道的完整性

    我有一个用 C 编写的 Internet Explorer 加载项 它通过 WCF 命名管道与 NET 桌面应用程序进行通信 桌面应用程序为 netNamedPipeBinding 创建 ServiceHost 并且 IE 加载项的每个实例