我有一個使用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中指定的用戶身份運行?