2011-07-13 51 views
5

我们遇到了使用我们的COM组件的rather strange issue。该组件实现了一个众所周知的界面,并被第三方封闭源代码产品(以下称为产品X)使用。产品X通过Windows注册表进行配置 - 产品X读取注册表并查找组件的类ID。COM对象从一个程序实例化,但不是在同一用户下运行的另一个程序

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

现在产品X不能使用我们的组件,并在Windows事件日志跟踪E_ACCESSDENIED,我们也看到了以下错误消息

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

在系统日志中。

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

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

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

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

+0

我很好奇为什么这得到了downvote。 – sharptooth

+0

啊,那些永远不会结束COM访问否认的人。我为你感到......我没有任何真正的建议,但我想知道:1)你知道X如何创建实例吗?他们可能在COAUTHINFO中有一些奇怪的地方。 2)如果X以管理员身份运行,则有任何更改? 3)你的Hello World与X有相同的位数吗? (应该不重要,但谁知道)。 – eran

+0

@eran:不知道X如何创建实例。 X和Hello world都以管理员身份运行,并且都具有相同的位数。 – sharptooth

回答

0

我认为你缺乏应用程序的配置。

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

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

相关问题