DCOM:CoCreateInstanceEx返回E_ACCESSDENIED

5
我正在开发一个DCOM应用程序,其中服务器和客户端在两台机器上运行,两台机器都运行着带有Service Pack 2的WinXP。在两台机器上,我使用相同的用户名和密码登录。
当一个机器上的客户端调用CoCreateInstanceEx时,要求另一台机器启动服务器应用程序,它返回E_ACCESSDENIED。
我尝试进入dcomcnfg中的服务器应用程序组件属性,并为所有内容授予每个人完全权限,但这并没有帮助。
我需要做什么才能使此调用成功?
更新:当服务器应用程序运行在Windows 2000上时,我不会收到此错误;CoCreateInstanceEx返回S_OK。
5个回答

2

如果这两台电脑不属于同一个域,您还需要授予“ANONYMOUS LOGON”启动和访问权限。 “Everyone”不包括此内容。


2

如果您的身份验证级别设置为默认值,那么在默认设置中将设置什么身份验证级别?只是出于兴趣。(虽然它可以在2000主机上工作,但这个问题可能已经没有意义了)

编辑:

另外: 我记得以前在使用DCOM时经常需要重启,所以当您满意dcomcnfg设置时,同时重启两台计算机也许会更好。


@Shaun Austin II: 全局默认的身份验证级别设置为连接,而默认的模拟级别设置为标识。 更新: ... 我尝试了重新启动,但问题仍然存在。感谢您所有的建议,但我仍然缺少一些东西。 - Isaac Moses

1

需要检查的三个问题:

1)返回dcomcnfg并确保不仅访问安全性,而且“启动权限”部分包含适当的安全用户或组。

2)确保身份验证级别设置为“None”以外的其他选项

3)还要检查所在磁盘上的组件位置是否对安全权限中配置的帐户实际可访问。

编辑:

再加一个:您也先调用了CoInitialiseSecurity()吗?这让我想起了什么!

编辑2:

根据您的更新:尝试完全关闭XP机器的防火墙,看看是否有所不同。您可能需要明确允许DCOM通过。


0

我曾经遇到过完全相同的问题。 这个问题发生在安装了XP SP2+或更新版本的机器上。

我通过以下步骤解决了这个问题:

  1. 确认客户端和服务器计算机在同一个域中。

  2. 您需要在两台计算机上使用相同的用户,或者如果您想在客户端和服务器上使用不同的用户,则需要确保客户端和服务器用户都具有两台计算机的权限(特别是确保它们都是分布式COM用户组的成员)。

  3. 打开组件服务MMC(运行dcomcnfg)。

  4. 转到“我的电脑”->“属性”->“默认属性”,确保默认模拟级别为“标识”

  5. 转到COM安全选项卡,在访问权限和启动和激活权限中,转到编辑限制,并将本地和远程访问权限添加到您的COM应用程序的客户端和服务器用户中

  6. 确保您的应用程序在端口135上有防火墙例外...

希望这可以帮助您!


0

顺便问一下,你的Windows 2000系统是哪个版本?Professional、Server还是Adv Server?

另外,两台计算机的域成员身份有什么区别(一个在域中,另一个不在,或者在不同的域中等)?

还有一件事——DCOM错误有时会出现在系统事件日志中,特别是在对象创建方面——你有检查过那里是否有线索吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接