У меня есть клиентские и серверные приложения 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?