允许与不匹配完整性级别的.NET COM服务器连接

我有一个基于COM的客户端服务器设置的问题。 COM服务器用C#(.NET 4.0)编写,并作为(注册的)本地服务器运行。

取决于哪个应用程序连接到服务器,其他客户端将收到服务器执行失败(HRESULTexception:0x80080005(CO_E_SERVER_EXEC_FAILURE)

这里解释了底层的问题(在COM部分是完整性感知) 。 我了解它的方式是由于高级应用程序创build具有更高完整性级别的服务器而造成的。 当另一个未升级的应用程序连接时,不允许连接到同一个实例。 当一个非提升的应用程序创build该进程时,会发生同样的情况。

我试图实现页面上描述的解决scheme:修改registry以设置应允许所有客户端连接的安全描述符。 在C ++中有一个代码示例 ,但是这在.NET中有效地实现了相同的function:

// Security Descriptor with NO_EXECUTE_UP var sd = new RawSecurityDescriptor("O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)"); byte[] securityDescriptor = new Byte[sd.BinaryLength]; sd.GetBinaryForm(securityDescriptor, 0); RegistryKey key = Registry.ClassesRoot.OpenSubKey("AppID\\{APP-ID-GUID}", true); if (key == null) { key = Registry.ClassesRoot.CreateSubKey("AppID\\{APP-ID-GUID}"); } using (key) { key.SetValue("LaunchPermission", securityDescriptor, RegistryValueKind.Binary); } 

但是,这并没有达到预期的效果。 当第二个客户端试图创build有问题的对象的实例时,Windows会尝试启动我的COM服务器的一个单独的实例,但服务器阻止两个实例作为相同的用户运行。 鉴于我设定的权限,我不希望第二个实例首先启动。

由于其中一个客户端应用程序在Medium IL中运行,另一个在High IL中运行,因此我还在强制性标签上尝试了变体,如:

 O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;ME) O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)(ML;;NX;;;ME)(ML;;NX;;;HI) 

我也尝试按照页面上的build议将ROTFlagsregistry项设置为0x1(ROTFLAGS_ALLOWANYCLIENT),但行为仍然没有改变。

我已经确定LaunchPermissionregistry值正在以某种方式使用。 我无法发现使用进程监视器正在读取的内容,但是当我使用dcomcnfg.exe工具设置相同的密钥时,可以通过拒绝启动权限来强制服务器加载失败。

我想指出,我的服务器进程不需要提升。 如何使高级和非高级进程能够连接到单个服务器实例?

2 Solutions collect form web for “允许与不匹配完整性级别的.NET COM服务器连接”

根据Windows Vista安全模型分析,您将需要使用共享对象(如命名pipe道)在不同的IL之间。 另外,共享对象应该有一个相当于您使用的最低IL的IL。

你必须将debugging选项设置为VS中的任何CPU。

  • 给应用程序提高UAC
  • 您是否可以强制Visual Studio始终以Windows 8中的pipe理员身份运行?
  • Windows 7是否像Vista那样限制文件夹访问?
  • 检测程序是否以完全pipe理员权限运行
  • 如何在batch file中请求pipe理员访问权限
  • 程序兼容性助理认为我的应用程序是安装程序
  • “以pipe理员身份运行”时Windowsbatch file的起始目录
  • 如何自动提升我的batch file,以便在需要时从UACpipe理员权限请求?
  • 如何截屏UAC提示?
  • 在运行时请求pipe理员权限