2012-07-20 48 views
2

我正面临一个相当奇怪和非常具体的DCOM相关问题,我希望有人可能遇到过它并解决它。Windows XP和Windows 7之间的DCOM互操作性

我想在Windows 7机器上的EXE服务器上实例化一个COM对象(称之为W7)。客户端驻留在Windows XP机器上(称之为WXP)。在WXP上,登录用户是域用户。在W7上,用户是本地用户。我(afaik)正确设置了所有DCOM权限,身份验证和帐户权限。没有涉及防火墙。

我得到的只是COM7E服务器进程在W7上启动,用户名我期望,但似乎甚至没有达到它的WinMain函数,并且保持挂起,除非我杀死它,否则永远不会死亡。我可以附加一个远程调试器(Visual Studio 2010),它会警告我这个进程可能会死锁,当我将它分解时,它会停在消息队列循环(GetMessage/Dispatch)中。

客户端得到一个(貌似有效的)指针,但是任何尝试使用它的结果都是E_ACCESSDENIED。

如果上述场景中的任何内容都发生更改,则COM对象的实例化会成功并且对象的行为正确。

我知道找到答案的机会很小,但任何提示都非常受欢迎。

谢谢。

回答

2

DCOM客户端和服务器既可以是工作组上的同一本地管理员,也可以是同一个域上的域用户。

你可以使用这个测试程序来检查,如果你的两台机器的配置是否正确: http://support.microsoft.com/kb/259011 这样,你确保你的机器的权限和防火墙都正确安装第一没有自己的代码。

+0

感谢您的回复。我会尽快尝试并发布结果。 令人困惑的是,相反的情况 - 客户端在W7上(不在域中),服务器在WXP上(在域中) - 工作正常!它可以与本地WXP凭证(超出域)一起使用,也可以与域凭证一起使用。 – racanu 2012-07-21 06:51:47

+0

我快速浏览了这篇文章,并注意到客户端没有取得凭证(即用户名/密码)。这使我认为它不提供CoInitializeSecurity中的任何AuthInfo,这意味着它将匿名连接到服务器。我没有为我的服务器配置这种情况。为了实验的目的,我会这样做,但我认为这不会是生产代码可以接受的解决方案。 – racanu 2012-07-21 07:01:19

+0

我发现这篇文章,我最初错过了,给了我一些想法,我可能会尝试:http:// stackoverflow。com/questions/6123301/how-do-impersonation-in-dcom-work – racanu 2012-07-21 07:11:30

1

回答我的问题...

事实证明,在客户端CoInitializeSecurity没有它需要毕竟所有凭证......还为时过早叫,被称为凭据之前。

我在实例化的每个组件上使用CoSetProxyBlanket(如此处所述:How does impersonation in DCOM work?)后我发现了这一点。我调用CoSetProxyBlanket的每个组件都正确工作。这引发我去检查CoInitializeSecurity。

反向连接(从W7到WXP)起作用仍然很奇怪,但这是我需要做的另一项研究。当前的问题可以被关闭。

相关问题