我有一个使用OLE自动化编排程序的DCOM客户端和服务器应用。它们在同一台PC上运行时很正常,但当服务器在不同的域中的另一台PC上运行时,我会得到E_ACCESSDENIED(0x80070005)的错误。
已经在服务器PC上配置了dcomcnfg以将任何DCOM对象的所有访问权限授予客户端指定的登录名和密码的用户。ServerApp及其类型库已在服务器PC上注册。
类型库也已在客户端PC上注册。我在ClientApp中直接指定了服务器名称,因此在客户端PC上不需要进行dcomcnfg配置,至少据我所知。
使用服务器名称、登录名、域和密码的CreateInstanceEx()运行良好。它返回IUnknown并同时在服务器PC上启动ServerApp。
但是,当我尝试查询服务器支持的接口时,就会出现E_ACCESSDENIED错误。
分析安全事件日志,我在那里有两个记录:
首先,由ClientApp指定凭据的用户进行了成功的网络登录。这发生在我调用CreateInstanceEx()时。
接下来,我的客户端PC上登录的用户尝试登录失败。由于两台PC不属于同一个域,因此服务器PC不知道该用户。
现在,为什么这个用户会登录服务器,特别是当我调用QueryInterface时呢?
研究CreateInterfaceEx参数,似乎有某种模拟机制在进行中。但是不清楚谁在模拟谁。涉及到三个用户凭据:
在服务器PC上运行ServerApp的用户(如在dcomcnfg中配置的)。
连接时ClientApp指定的用户凭证。
在客户端PC上以ClientApp凭据运行的用户。
无论如何,如果涉及#3,则有一位多余的用户。如果DCOM要在服务器PC上识别/模拟#3,那么我为什么需要指定#2的凭据?有什么意义吗?
DCOM应该模拟#2很合乎逻辑,因为这是我明确指定的凭据。但是为什么还会出现第二次登录尝试呢?
有人可以解释一下模拟如何工作吗,还有是否有一种方法可以忽略它并以在dcomcnfg中指定的用户身份运行?