我有一个使用OLE自动编组器的DCOM客户端和服务器应用程序。它们在同一台PC上运行时工作良好,但当服务器位于不同的PC上,而不在同一个域中时,我得到E_ACCESSDENIED(0x80070005)。DCOM中的模拟如何工作?
服务器PC使用dcomcnfg进行配置,以便将所有DCOM对象的访问权授予其客户端上指定的登录名和密码的用户。 ServerApp及其类型库在服务器PC上注册。
类型库也在客户端PC上注册。我直接在ClientApp中指定服务器名称,因此就我所知,客户端PC上不需要配置dcomcnfg。
CreateInstanceEx()与服务器名称,登录,域和密码工作正常。它返回IUnknown,同时在服务器PC上启动ServerApp。
但是当我尝试QueryInterface()为服务器支持的接口时,我得到E_ACCESSDENIED。
分析安全事件日志,我有两个记录有:
首先,其凭据我ClientApp指定用户一个成功的网络登录。当我调用CreateInstanceEx()时会发生这种情况。
接下来,登录失败的用户登录客户端PC。由于两台PC不在一个域中,因此服务器PC不知道该用户。
现在,为什么这个用户会登录到服务器,特别是当我调用QueryInterface的所有东西?
研究CreateInterfaceEx参数,它似乎有某种模拟机制正在进行。但是谁扮演谁并不清楚。有包括三个用户凭证:在其下ServerApp服务器PC上运行(如在DCOMCNFG配置)
用户。
ClientApp在连接时指定其凭据的用户。
ClientApp在客户端PC上运行其凭据的用户。
无论你如何看待它,如果涉及#3,它就是一个用户太多。如果DCOM无论如何要在服务器PC上识别/模拟#3,为什么我需要指定#2的凭据?到什么点?
对于DCOM来说,模拟#2似乎是合乎逻辑的,因为这是我明确指定的凭据。但为什么第二次登录尝试呢?
有人能解释一下模仿是如何工作的,以及是否有办法忽略它并以dcomcnfg中指定的用户身份运行?