OLE オートメーション マーシャラーを使用する DCOM クライアントおよびサーバー アプリケーションがあります。同じ PC で実行すると正常に動作しますが、サーバーが同じドメインにない別の PC にある場合、E_ACCESSDENIED (0x80070005) が発生します。
サーバー PC は dcomcnfg で構成され、クライアントで指定したログインとパスワードを持つユーザーに、任意の DCOM オブジェクトへのすべてのアクセスを許可します。ServerApp とそのタイプ ライブラリは、サーバー pc に登録されます。
タイプ ライブラリもクライアント PC に登録されます。ClientApp でサーバー名を直接指定するので、私が理解している限り、クライアント PC で dcomcnfg の構成は必要ありません。
サーバー名、ログイン、ドメイン、およびパスワードを指定した CreateInstanceEx() は正常に機能します。IUnknown を返すと同時に、サーバー PC で ServerApp を起動します。
しかし、サーバーがサポートするインターフェースに対して QueryInterface() を実行しようとすると、E_ACCESSDENIED が返されます。
セキュリティ イベント ログを分析すると、次の 2 つのレコードがあります。
まず、ClientApp で指定した資格情報を持つユーザーによるネットワーク ログインが成功します。これは、CreateInstanceEx() を呼び出したときに発生します。
次に、クライアント PC にログインしているユーザーによるログイン試行の失敗。2 台の PC はドメインに属していないため、このユーザーはサーバー PC に認識されません。
さて、特に私がすべてのものの QueryInterface を呼び出すとき、なぜこのユーザーがサーバーにログインするのでしょうか?
CreateInterfaceEx パラメータを調べると、ある種のなりすましメカニズムが進行しているようです。しかし、誰が誰を偽装しているかは不明です。関連する 3 つのユーザー資格情報があります。
サーバー PC で ServerApp を実行するユーザー (dcomcnfg で構成)。
接続時に ClientApp が指定する資格情報を持つユーザー。
クライアント PC で ClientApp を実行する資格情報を持つユーザー。
どう見ても3番が絡むと1ユーザー多すぎ。とにかく DCOM がサーバー PC で #3 を識別/偽装する場合、なぜ #2 の資格情報を指定する必要があるのですか? どこまで?
DCOM が #2 になりすますのは理にかなっているように思えます。これは、資格情報として明示的に指定したものだからです。しかし、なぜ 2 回目のログイン試行を行うのでしょうか?
偽装がどのように機能するか、またそれを無視して dcomcnfg で指定されたユーザーとして実行する方法があるかどうかを誰かが説明してもらえますか?