首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >允许连接到完整性级别不匹配的.NET COM服务器

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

Stack Overflow用户
提问于 2012-08-20 22:32:14
回答 2查看 1.9K关注 0票数 54

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

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

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

我已经尝试实现了page上描述的解决方案:修改注册表以设置一个安全描述符,该描述符应该允许所有客户端进行连接。在C++中有一个code sample,但在.NET中实际上做了同样的事情:

代码语言:javascript
复制
// 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上尝试了一些变体,例如:

代码语言:javascript
复制
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工具设置相同的键时,我可以通过拒绝启动权限来强制服务器加载失败。

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

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12039624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档