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

Posted

技术标签:

【中文标题】允许以不匹配的完整性级别连接到 .NET COM 服务器【英文标题】:Allowing connection to .NET COM server with mismatching integrity level 【发布时间】:2012-08-15 21:34:50 【问题描述】:

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

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

here (in the section COM is integrity aware) 解释了根本问题。我理解它的方式是,这是由于提升的应用程序创建了具有更高完整性级别的服务器。当另一个非提升的应用程序随后连接时,不允许连接到同一个实例。当一个非提升的应用程序创建进程,然后一个提升的应用程序连接时,也会发生同样的情况。

我已尝试实施page 中描述的解决方案:修改注册表以设置应允许所有客户端连接的安全描述符。在 C++ 中有一个 code sample,但这在 .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 服务器的单独实例,但服务器阻止两个实例以同一用户身份运行。鉴于我设置的权限,我不希望首先启动第二个实例。

由于其中一个客户端应用程序在中等 IL 中运行,而另一个在高 IL 中运行,我还在 mandatory label 上尝试了变体,例如:

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 工具设置相同的密钥时,我可以通过拒绝启动权限来强制服务器加载失败。

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

【问题讨论】:

服务器是否在注册表中注册? @tyranid:是的,它有一个 AppID。我已经更新了我的代码以编写注册表项,因为 MSDN 解决方案提到使用此解决方案。 我猜这是一个愚蠢的问题,但您是否尝试过设置 AccessPermission? msdn.microsoft.com/en-us/library/windows/desktop/… (开箱即用的问题)COM 是必需的吗?我以前也有过类似的情况。我退缩了,做了一个包装器(COM+/WCF)并调用了包装器。 “当一个非提升的应用程序创建进程,然后[接着]一个提升的应用程序连接时,也会发生同样的情况。”这种情况不应违反完整性控制...您确定没有其他问题在起作用吗?在这种情况下,应用程序如何失败? 【参考方案1】:

根据Windows Vista Security Model Analysis,您将需要使用共享对象(例如命名管道)在不同的 IL 之间移动。此外,共享对象的 IL 应与您正在使用的最低 IL 等效。

【讨论】:

【参考方案2】:

您必须在 VS 中将 Debug 选项设置为 Any cpu。

【讨论】:

以上是关于允许以不匹配的完整性级别连接到 .NET COM 服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法从 .NET 应用程序 (Npgsql) 连接到 Heroku Postgres

Java如何使服务器允许连接到套接字端口?

寻找允许连接到 RESTful Web 服务的报表设计器 [关闭]

远程桌面连接到服务器失败:“要求的函数不受支持”

将 32 位 VB.Net 连接到 64 位 Access .ACCDB

无法使用 AFNetworking 将 iOS 连接到 asp.net webservices