相关疑难解决方法(0)

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

我遇到基于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);
}
Run Code Online (Sandbox Code Playgroud)

但是,这没有达到预期的效果.当第二个客户端尝试创建相关对象的实例时,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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

.net c# com uac

54
推荐指数
1
解决办法
1814
查看次数

指定实例化proc COM对象时要使用的单元状态

我在.NET中创建了一个COM对象,并将其注册为使用Pooling = 1的COM +服务器应用程序regsvcs.我目前正在寻找一个bug,因此需要确保这个COM对象在STA中运行,而不是在MTA中运行.我怎么指定这个?
以下任何一项都会对我有所帮助:

  • 组件服务中的设置捕捉
  • 一个设置/代码片段,它使COM对象只允许STA而不是Both
  • 调用者端的C#中的设置/代码片段告诉COM +应该用STA初始化COM对象

更新:
我尝试手动ThreadingModel将注册表中的条目更改BothApartment.这也没有帮助,因为当我尝试实例化COM对象时,我得到一个COMException(0x80110802)并且事件查看器说:

注册表中指定的组件的线程模型与注册数据库不一致.有缺陷的组件是:<MyComponent>

我需要更改线程模型吗?例如在"注册数据库"中?我在哪里可以找到它?

谢谢!

.net c# com com+

5
推荐指数
1
解决办法
1873
查看次数

标签 统计

.net ×2

c# ×2

com ×2

com+ ×1

uac ×1