2

我正面临一个相当奇怪且非常具体的 DCOM 相关问题,我希望有人可能已经遇到并解决了它。

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

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

客户端获得一个(看似有效的)指针,但任何尝试使用它都会导致 E_ACCESSDENIED。

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

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

谢谢。

4

2 回答 2

2

DCOM 客户端和服务器要么需要是同一工作组中的本地管理员,要么是同一域中的域用户。

您可以使用此测试应用程序检查您的两台机器是否配置正确: http: //support.microsoft.com/kb/259011 这样您就可以确保您的机器的权限和防火墙首先正确设置,而无需您自己的代码。

于 2012-07-20T21:37:25.290 回答
1

回答我自己的问题...

事实证明,在客户端 CoInitializeSecurity 中并没有它需要的所有凭据......它被调用得太早了,在凭据已知之前。

在我实例化的每个组件上使用 CoSetProxyBlanket (如此处所述:DCOM 中的模拟如何工作? )后,我发现了这一点。我调用 CoSetProxyBlanket 的每个组件都正常工作。这促使我去仔细检查 CoInitializeSecurity。

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

于 2012-07-23T09:39:32.013 回答