允许与不匹配完整性级别的.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工具设置相同的密钥时,可以通过拒绝启动权限来强制服务器加载失败。

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

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

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