【问题标题】:COM object instantiates from one program but not from another running under the same userCOM 对象从一个程序实例化,但不是从在同一用户下运行的另一个程序实例化
【发布时间】: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+


【解决方案1】:

我认为您缺少应用程序的配置。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多