我有一个基于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服务器的一个单独的实例,但是服务器阻止两个实例运行相同的用户。 鉴于我设置的权限,我不希望第二个实例,以在第一时间推出。
由于客户端应用之一是在中IL和其他高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注册表值以某种方式被使用。 我不能发现它正在使用进程监视器读哪里,但是当我使用dcomcnfg.exe
工具来设定相同的密钥,我可以强制服务器通过拒绝启动权限失败负载。
我想指出的是,我的服务器过程不需要提升。 如何使双方升高和非提升的进程能够连接到一台服务器实例?