【发布时间】:2011-10-04 12:01:19
【问题描述】:
我们的 COM 组件遇到了rather strange issue。组件实现了众所周知的接口,被第三方闭源产品(以下简称产品X)消费。产品 X 是通过 Windows 注册表配置的 - 产品 X 读取注册表并找到我们组件的类 ID。
我们的组件是使用 ATL 在本机 C++ 中实现的 32 位进程内,我们在 64 位系统上向 COM+ 注册它,以便在代理进程中激活它。
现在产品 X 无法使用我们的组件并在 Windows 事件日志中跟踪 E_ACCESSDENIED,我们还看到以下错误消息
应用程序特定的权限设置不授予用户 MACHINENAME\administrator SID (SID这里)来自地址 LocalHost(使用 LRPC)。可以使用组件服务管理工具修改此安全权限。
在系统日志中。
这看起来像是权限问题。所以我们用 C# 编写了一个“Hello, world”程序,news 是一个 COM 组件,并从中调用一个简单(永不失败)的方法:
OurComponent.IOurComponent 组件 = new OurComponent.OurcomponentClass(); 组件.TrivialMethod();
当该程序从与产品 X 相同的帐户运行时,它可以正常工作 - 组件已实例化,我们甚至可以在 COM+ 控制台中看到“带加号的绿色球”旋转。
所以我们有两个程序在同一台机器上以相同的用户帐户运行,一个可以实例化 COM 组件而另一个不能。这可能是什么原因?
【问题讨论】:
-
我很好奇为什么这会被否决。
-
啊,那些永无止境的 COM 访问拒绝。我对你有感觉......我没有任何真正的建议,但我想知道:1)你知道 X 是如何创建实例的吗?他们可能在 COAUTHINFO 中有一些奇怪的地方。 2) 如果 X 以管理员身份运行,有什么变化吗? 3) 你的 Hello World 和 X 有相同的位数吗? (应该没关系,但谁知道)。
-
@eran:不知道 X 如何创建实例。 X 和 Hello world 都以管理员身份运行,并且具有相同的位数。
-
也许你应该尝试相反的方式 - 创建一个重要的测试应用程序,使用实例创建的安全设置,看看是什么让你被拒绝。鉴于您无法更改 X,您显然仍需找到解决方案,但它可能会为您指明特定设置。
-
@eran:是否有任何地方的代码 sn-ps 显示与您建议我做的类似的事情?
标签: c# windows com com-interop com+