2010-06-02 2 views
5

С помощью COM-объекта вне процесса (LocalServer32) можно определить процесс клиента, который запросил создание объекта? - Чтобы быть конкретным, мне нужно получить командную строку клиентских процессов.Может ли COM-объект вне процесса определять его родительский процесс?

Этот вопрос возникает из-за того, что (из-за плохой стандартизации, реализации и поддержки) потенциальные сторонние клиенты объекта имеют множество идиосинкразий, которые объект должен решить.

Для этого объект должен быть способен идентифицировать своего текущего клиента.

Расширение интерфейса COM-объекта, чтобы клиент мог идентифицировать себя, к сожалению, невозможен ... или, точнее, интерфейс может быть расширен, но я не смогу заставить клиентов называть расширение ,

ответ

2

Изучив это далее, я подозреваю, что ответ будет «НЕТ», но, во что бы то ни стало, скажите мне, что я неправ.

Использование Process Explorer Я вижу, что родительский процесс для моего COM-объекта является экземпляром «svchost.exe», а не клиентским приложением.

0
+0

Я так не считаю. Похоже, это позволяет мне притворяться, что у меня есть атрибуты безопасности клиентов. –

+0

Вы пытались вызвать OpenThreadToken + GetTokenInformation (после CoImpersonateClient). Вы, по крайней мере, сможете найти сеанс сеанса входа в систему и пользовательский вход в систему. – Anders

+0

Прошу прощения, но с учетом этой информации, как я могу получить клиентский процесс COM-объекта? –

1

Поскольку процессы COM-сервера являются общими для всех клиентов одного и того же AppID, это не возможно, на самом деле получить PID клиентского приложения. Как сказал @Anders, вы можете использовать CoImpersonateClient (или, лучше, позвонить CoGetCallContext и опросить полученный результат IServerSecurity), чтобы найти учетную запись и сеанс входа в систему вызывающего абонента, но вы не можете получить сам процесс.

Если вы пытаетесь обойти ошибки у старых клиентов, я бы рекомендовал вам создать новый набор CLSID (или IIDs, если вы сможете подражать всем ошибкам, на которые полагаются старые клиенты, с помощью прокладок) для новых (не- устаревшие) клиенты с ОЧЕНЬ строгой проверкой ввода и внедрением новых функций только в этих новых CLSID. Устаревшие клиенты придерживаются своего старого CLSID, в котором вы можете просто использовать существующую, устаревшую реализацию (или клоун, совместимый с ошибкой для ошибок).

Смежные вопросы