Почему вызов ShellExecute в Win Service приводит к сбою несвязанных входящих COM-соединений с E_ACCESSDENIED? - PullRequest
0 голосов
/ 20 февраля 2019

Продукт, который я поддерживаю, имеет службу Windows, написанную на C ++, и эта служба предоставляет интерфейс COM, к которому может обращаться размещенная среда сценариев (размещенная в dllhost), чтобы пользователи могли писать сценарии в powershell и взаимодействовать со службой,Служба поддерживает несколько COM-классов, которые наследуются от IActiveScriptSite / IActiveScript, чтобы предоставить эту функциональность размещенной среде.

Эта функция уже давно работает хорошо, но недавно у нас была ошибка, из-за которой все это сломалось.Ошибка проявилась, когда размещенная среда начала получать E_ACCESSDENIED при вызове функции OnStateChange () в интерфейсе IActiveScriptSite.Это был первый вызов интерфейса.

После выяснения, какие изменения вызвали проблему, мы в конечном итоге обнаружили, что всю проблему можно воспроизвести, поместив один вызов ShellExecute () при инициализации нашего сервиса.вот так:

HRESULT CServiceObject::Run(int nShowCmd)
{
    ShellExecuteW(nullptr, nullptr, L"ipconfig", L"/all", nullptr, SW_HIDE);

    // Other initializeation code which ultimately 
    // leads to a thread which starts the hosted environment

Это, по-видимому, в совершенно не связанной области кода с кодом, в котором возникла проблема.

Чтение документации ShellExecute заставляет меня попробовать:

  • Инициализация COM до ShellExecute (это не имело никакого значения, с какой бы квартирой модель COM ни была инициализирована, мы обычно везде используем MTA)
  • Попытка запустить ShellExecute в своем собственном потоке (это неничего не меняет)
  • Замена ShellExecute версией ShellExecuteEx и синхронизация, чтобы процесс завершился до того, как что-то еще произошло (это не имело никакого значения)

ТакК сожалению, ShellExecute ломает весь наш сервис.Кто-нибудь может подумать о том, что он может делать, что влияет на состояние программы после ее запуска?На самом деле я могу решить эту проблему, просто не вызывая ShellExecute (), но беспокоюсь, что что-то настолько тривиальное и, казалось бы, не связанное с другим кодом, может его сломать, поэтому я хочу понять, в чем проблема.

1 Ответ

0 голосов
/ 20 февраля 2019

Эта проблема оказалась из-за того, что наш код вызывал CoInitializeSecurity ().Вызов ShellExecute () до этого приводит к тому, что защита CoInitializeSecurity () вызывается неявно, а затем происходит сбой при его вызове, что не позволяет нашей размещенной среде сценариев связаться со службой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...