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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

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

根据哪个应用程序连接到服务器,其他客户端将收到服务器执行失败(来自HRESULT的异常:0x80080005(CO_E_SERVER_EXEC_FAILURE)

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

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

// 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);
}

但是,这并没有达到预期的效果。当第二个客户端尝试创建有问题的对象的实例时,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)

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

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

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

提问于
用户回答回答于

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

用户回答回答于

扫码关注云+社区