Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows XP和Windows 7之间的DCOM互操作性_C++_Windows_Dcom - Fatal编程技术网

C++ Windows XP和Windows 7之间的DCOM互操作性

C++ Windows XP和Windows 7之间的DCOM互操作性,c++,windows,dcom,C++,Windows,Dcom,我正面临着一个相当奇怪和非常具体的DCOM相关问题,我希望有人可能遇到了它并解决了它 我试图在Windows7机器(称为W7)上的EXE服务器中实例化COM对象。客户端驻留在Windows XP计算机上(称为WXP)。在WXP上,登录的用户是域用户。在W7上,用户是本地用户。我已(afaik)正确设置了所有DCOM权限、身份验证和帐户权限。没有涉及防火墙 我得到的只是COM EXE服务器进程是在W7上启动的,使用的用户名是我期望的,但似乎连它的WinMain功能都没有,并且一直挂着,除非我杀死它

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

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

我得到的只是COM EXE服务器进程是在W7上启动的,使用的用户名是我期望的,但似乎连它的WinMain功能都没有,并且一直挂着,除非我杀死它,否则它永远不会死。我可以附加一个远程调试器(VisualStudio2010),它会警告我进程可能已死锁,当我中断它时,它会在消息队列循环(GetMessage/Dispatch)中停止

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

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

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


谢谢。

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

您可以使用此测试应用程序检查两台机器的配置是否正确:
通过这种方式,您可以确保您的计算机的权限和防火墙在没有您自己的代码的情况下首先正确设置。

回答我自己的问题

事实证明,在客户端中,CoInitializeSecurity毕竟没有它所需要的所有凭据。。。在了解凭据之前,调用它太早了

在我实例化的每个组件上使用CoSetProxyBlanket(如下所述)之后,我发现了这一点。我称之为CoSetProxy毯子的每个组件都正常工作。这促使我去仔细检查CoInitializeSecurity


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

谢谢您的回复。我将很快尝试并发布结果。令人困惑的是,相反的情况——客户机位于W7(不在域中)而服务器位于WXP(在域中)——是有效的!它可以与本地WXP凭据(域外)一起使用,也可以与域凭据一起使用。这使我认为它在CoInitializeSecurity中不提供任何AuthInfo,这意味着它以匿名方式连接到服务器。我还没有为这种情况配置服务器。为了实验,我会这么做,但我认为这对生产代码来说不是一个可接受的解决方案。我发现了这篇我原本错过的文章,这给了我一些可以尝试的想法:Vista经历了一些重大的安全功能更改,但我很惊讶您第一次评论中的反向设置能够正常工作。我自己可能也错过了一些历史。您是否尝试使用dcomcfng验证服务器上当前设置的安全设置?是。我将在W7上用于实例化COM服务器(我们称之为srvuser)的用户添加到本地分布式COM用户组,然后我授予该组完整的本地和远程启动和激活权限。我还在本地安全策略中授予组“以批处理方式登录”权限。在客户端上,我在CoInitializeSecurity中使用srvuser的凭据。当客户端上的交互用户是域用户时,我得到了前面描述的失败。如果客户端上的交互用户是本地用户,则连接可以工作。我无法想象是什么导致了这一切。