У меня есть клиентские и серверные приложения DCOM, в которых используется маршаллер OLE. Они отлично работают при работе на одном ПК, но когда сервер находится на другом ПК не в том же домене, я получаю E_ACCESSDENIED (0x80070005).
Сервер ПК настроен с помощью dcomcnfg, чтобы предоставить всем доступ к любому объекту DCOM пользователю, чей логин и пароль я указываю на клиенте. ServerApp и его библиотека типов зарегистрированы на сервере.
Библиотека типов также зарегистрирована на клиентском ПК. Я указываю имя сервера непосредственно в ClientApp, поэтому на ПК клиента не требуется настройка dcomcnfg, насколько я понимаю.
CreateInstanceEx() с именем сервера, логином, доменом и паролем отлично работает. Он возвращает IUnknown и одновременно запускает ServerApp на сервере ПК.
Но когда я пытаюсь выполнить QueryInterface() для интерфейса, который поддерживает сервер, я получаю E_ACCESSDENIED.
Анализ журнала событий безопасности, у меня есть две записи:
Во-первых, успешный сетевой вход пользователя, чьи учетные данные я укажу в ClientApp. Это происходит, когда я вызываю CreateInstanceEx().
Затем неудачная попытка входа в систему с помощью пользователя, под которым я зарегистрирован на клиентском ПК. Поскольку два компьютера не находятся в домене, этот пользователь неизвестен серверу ПК.
Теперь, почему черт мог бы этот пользователь войти на сервер, особенно когда я вызываю QueryInterface из всех вещей?
Изучая параметры CreateInterfaceEx, похоже, что происходит какой-то механизм олицетворения. Но неясно, кто олицетворяет кого. Существуют три пользовательских учетных данных:
-
Пользователь, под которым ServerApp запускается на сервере ПК (как настроено в dcomcnfg).
-
Пользователь, чьи учетные данные ClientApp указывает при подключении.
-
Пользователь, чьи учетные данные ClientApp запускается на клиентском ПК.
Независимо от того, как вы смотрите на него, если # 3 задействовано в нем слишком много. Если DCOM собирается идентифицировать/выдавать себя за №3 на сервере ПК, почему мне нужно указать учетные данные # 2? В какой момент?
Казалось бы логичным для DCOM выдавать себя за №2, потому что это то, что я явно указал в качестве моих учетных данных. Но почему вторая попытка входа в систему затем?
Может кто-нибудь объяснить, как работает олицетворение,, а также если есть способ просто игнорировать его и запускать как пользователь, указанный в dcomcnfg?