我有一个使用 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 参数,似乎存在某种模拟机制。但目前还不清楚谁冒充谁。涉及三个用户凭据:
ServerApp 在服务器 PC 上运行的用户(在 dcomcnfg 中配置)。
ClientApp 在连接时指定其凭据的用户。
其凭据 ClientApp 在客户端 PC 上运行的用户。
不管你怎么看,如果涉及#3,那就是一个用户太多了。如果 DCOM 无论如何都要在服务器 PC 上识别/模拟 #3,为什么我需要指定 #2 的凭据?到什么地步?
DCOM 冒充 #2 似乎是合乎逻辑的,因为这是我明确指定为我的凭据的。但是为什么要进行第二次登录尝试呢?
有人可以解释一下模拟是如何工作的,以及是否有办法忽略它并以 dcomcnfg 中指定的用户身份运行?