我们的COM组件面临一个相当奇怪的问题 。 该组件实现了一个众所周知的界面,并被第三方封闭源代码产品(以下简称产品X)所使用。 产品X通过Windowsregistryconfiguration – 产品X读取registry并查找组件的类ID。
我们的组件是使用ATL在本地C ++中实现的32位进程,我们在64位系统上使用COM +进行注册,以便在代理进程中激活它。
现在,产品X无法使用我们的组件,并在Windows事件日志中跟踪E_ACCESSDENIED
,我们也看到以下错误消息
特定于应用程序的权限设置不会授予用户MACHINENAME \ administrator SID(此处为SID)的CLSID(此处为COM对象的类ID)和APPID(此处为COM +应用程序的应用程序ID)的COM服务器应用程序的本地激活权限地址LocalHost(使用LRPC)。 可以使用组件服务pipe理工具修改此安全权限。
在系统日志中。
这看起来像一个权限问题。 所以我们在C#中创build了一个“Hello,world”程序,这个new
COM组件调用了一个简单的(永不失败)方法:
OurComponent.IOurComponent组件= new OurComponent.OurcomponentClass(); component.TrivialMethod();
当这个程序运行在与Product X相同的账户时,它可以正常运行 – 组件被实例化,我们甚至可以在COM +控制台中看到“带有加号的绿球”。
所以我们有两个程序在相同的用户帐户下运行在同一台机器上,一个可以实例化一个COM组件,另一个不能。 这可能是什么原因?
我认为你缺乏应用程序的配置。
所以这两件事情的工作。 1您的应用程序需要编译为“可见”。 2您需要注册com组件(如果尚未注册)
转到开始 – >管理工具 – >组件服务。 展开组件服务,计算机,我的电脑,DCOM配置。 向下滚动并找到应用程序。 右键 – >点击 – >属性,然后选择安全选项卡。 您会在这里看到一些选项 – 第一个块启动和激活权限 – 确保已选择自定义单选按钮,然后单击编辑。 现在,给你正在使用的帐户启动,激活,以及远程启动/激活权限。 重新启动机器(或重新启动服务/应用程序),并希望它会工作。