COM对象从一个程序实例化,而不是在同一个用户下运行的另一个程序

时间:2011-07-13 13:13:25

标签: c# windows com com-interop com+

我们的COM组件面临rather strange issue。该组件实现了众所周知的接口,并由第三方闭源产品(以下称为产品X)使用。产品X通过Windows注册表配置 - 产品X读取注册表并查找组件的类ID。

我们的组件是使用ATL在本机C ++中实现的32位进程,我们在64位系统上使用COM +注册它,以便在代理过程中激活它。

现在,产品X无法在Windows事件日志中使用我们的组件和跟踪E_ACCESSDENIED,我们也看到以下错误消息

  

特定于应用程序的权限设置不会为具有CLSID {此处为COM对象的类ID}和APPID {此处为COM +应用程序的应用程序ID}的COM服务器应用程序授予用户MACHINENAME \ administrator SID(SID)的本地激活权限这里)来自地址LocalHost(使用LRPC)。可以使用组件服务管理工具修改此安全权限。

在系统日志中。

这看起来像权限问题。所以我们用C#编写了一个“Hello,world”程序,new是一个COM组件,并从中调用一个简单的(从不失败)方法:

OurComponent.IOurComponent component = new OurComponent.OurcomponentClass();    component.TrivialMethod();

当该程序从与产品X相同的帐户运行时,它可以正常工作 - 组件被实例化,我们甚至在COM +控制台中看到“带有加号的绿球”旋转。

因此,我们在相同的用户帐户下运行同一台计算机上的两个程序,一个可以实例化COM组件而另一个不能。可能是什么原因?

1 个答案:

答案 0 :(得分:0)

我认为你缺少app的配置。

这样做有两件事。 1您的应用程序需要编译为“Com Visible”。 2您需要注册com组件(如果尚未注册)

转到开始 - >管理工具 - >组件服务。展开组件服务,计算机,我的电脑,DCOM配置。向下滚动并找到该应用程序。对 - >点击 - >属性,然后选择安全选项卡。您将在此处看到一些选项 - 第一个块启动和激活权限 - 确保选中“自定义”单选按钮,然后单击“编辑”。现在,为您正在使用的帐户启动,激活以及远程启动/激活权限。重启机器(或重启服务/应用程序),希望它能正常工作。