允许与不匹配完整性级别的.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议将ROTFlags
registry项设置为0x1(ROTFLAGS_ALLOWANYCLIENT),但行为仍然没有改变。
我已经确定LaunchPermissionregistry值正在以某种方式使用。 我无法发现使用进程监视器正在读取的内容,但是当我使用dcomcnfg.exe
工具设置相同的密钥时,可以通过拒绝启动权限来强制服务器加载失败。
我想指出,我的服务器进程不需要提升。 如何使高级和非高级进程能够连接到单个服务器实例?
根据Windows Vista安全模型分析,您将需要使用共享对象(如命名pipe道)在不同的IL之间。 另外,共享对象应该有一个相当于您使用的最低IL的IL。
你必须将debugging选项设置为VS中的任何CPU。
- 如何使用reflection在.NET中调用重载的方法
- String.Contains()比String.IndexOf()更快吗?
- .NET程序集签名的最佳实践?
- 使用ASP.NET Core Web应用程序(.NET Core)与net461设置为唯一框架并使用(.NET Framework)模板之间的区别
- AppSettings vs applicationSettings的优缺点(.NET app.config / Web.config)
- 单线程单元 – 不能实例化ActiveX控件
- 用委托或lambda包装StopWatch时间?
- 有没有一个“String.Format”,可以接受命名input参数,而不是索引占位符?
- 在.NET中多重inheritance有什么好的select?