如何解决系统事件出现DCOM 10009错误?

症状:

我们有时在系统事件中会遇到DCOM 10009的错误(如下所示),或者会在DCOM客户应用程序中接收到错误代码0x800706ba:

Event Type:        Error
Event Source:    DCOM|
Event Category:                None
Event ID:              10009
Date:                     2010-2-22
Time:                     10:02:07
User:                     N/A
Computer:          <Computer Name>
Description:
DCOM was unable to communicate with the computer <Target Computer Name> using any of the configured protocols.

Simply speaking, DCOM 10009 indicates that the DCOM client located on this <Computer Name> can't communicate with the DCOM|COM+ server located on that <Target Computer  Name>.

发生过程:

当用户调用CoGetClassObject或者CoCreateInstance(CreateObject或者在VB中 new)来启用一个组件的时候, COM runtime会联系它的本地SCM COM的启用者(PRCSS服务),登陆相应的提供这个组件的COM服务器。

如果这个组件是远端的,本地的RPCSS服务会把请求传输给远端机器上的RPCSS服务。

但是如果远端服务器的RPCSS服务不可用的话,DCOM 10009会出现并通知管理员,调用栈内容如下所示:

ChildEBP RetAddr

006df364 757f8b72 ADVAPI32!ReportEventW-> then DCOM 10009 is logged.

006df3a0 757f6542 rpcss!LogRemoteSideUnavailable+0x63 ->here we don't found the server.

006df40c 757f6781 rpcss!CRemoteMachine::Activate+0x294

006df648 757f6861 rpcss!RemoteActivationCall+0xf2

006df664 757edb5c rpcss!ActivateRemote+0x8e

006df6c0 757d629c rpcss!Activation+0x343

006df718 757d7680 rpcss!ActivateFromProperties+0x1c2

006df724 757d76c0 rpcss!CScmActivator::CreateInstance+0xd
...
...

 

发生原因:

概括说来,发生DCOM 10009错误的原因在于:本地RPCSS服务不能连接到远端目的服务器的RPCSS服务。有几种情形造成这种情况的出现:

  • 1. 远端的目的服务器可能出于offline的状态,例如可能是在维护。
  • 2. 双方服务器都出于online的状态,但是在两个服务器的PRC通信出现问题,例如服务器名称解析失败,可提供RPC通信的端口资源耗尽,防火墙配置等等。

解决方法:

正如上文所提到的, 引起DCOM 10009出现有着很多可能性,我们 需要针对不同的情形来做不同的处理:

情形1:

如果远端的服务器是处于维护阶段, DCOM 10009的出现是正常的,我们可以通过ping <远端服务器>来确认远端服务器状态。

情形2:

如果远端服务器是处在online的状态却仍然出现DCOM 10009的话,请执行以下步骤:

  • 1. Ping<远端服务器>和IP地址来确认网络状况良好。
  • 2. Telnet<远端服务器>135以确认Port 135没有被防火墙阻止。
  • 3. 如果已经配置过PRC通信的动态端口, 可以通过以下命令来两个服务器的端口资源:Netstat -anb

如果所有的动态端口都在被使用了,或者只有很少可用,可以考虑扩展动态端口。

关于如何配置与防火墙一起使用的 RPC 动态端口分配请参考:https://support.microsoft.com/?id=154596
关于DCOM端口范围配置问题请参考:https://support.microsoft.com/kb/217351/en-us

  • 4. 如果以上步骤都正常, 可以使用DTCPing工具来确认两个服务器之间的DCOM通信是否正常。

关于如何使用DTCPing工具来解决MS DTC中的连接问题请参考:

https://support.microsoft.com/kb/918331/en-us

注意:DTCPing工具并非专门指用来解决MSDTC问题的,这个工具可以用来解决所有DCOM通信问题。

参考:

FIX: You cannot obtain detailed error information about DCOM 10009 errors in Windows Server 2003

https://support.microsoft.com/kb/910695

微软Internet开发者支持小组