Мы столкнулись с довольно странной проблемой с нашим COM-компонентом. Компонент реализует хорошо известный интерфейс и используется сторонним продуктом с закрытым исходным кодом (далее - Продукт X). Продукт X настраивается через реестр Windows - Продукт X читает реестр и находит идентификатор класса нашего компонента.
Наш компонент является 32-битным внутрипроцессным, реализованным на родном C ++ с использованием ATL, и мы регистрируем его в COM + в 64-битных системах, чтобы он активировался в суррогатном процессе.
Теперь продукт X не может использовать наш компонент и отслеживает E_ACCESSDENIED
в журнале событий Windows, и мы также видим следующее сообщение об ошибке
Параметры разрешений для конкретного приложения не предоставляют разрешение локальной активации для приложения COM-сервера с CLSID {идентификатор класса COM-объекта здесь} и APPID {идентификатор приложения для приложения COM + здесь} пользователю MACHINENAME \ SID администратора (SID здесь) из адрес LocalHost (с использованием LRPC). Это разрешение безопасности можно изменить с помощью инструмента администрирования служб компонентов.
в системном журнале.
Похоже, проблема с разрешениями. Итак, мы создали программу «Hello, world» на C #, которая new
представляет компонент COM и вызывает из него один тривиальный (никогда не дает сбоев) метод:
OurComponent.IOurComponent component = новый OurComponent.OurcomponentClass (); component.TrivialMethod ();
Когда эта программа запускается из той же учетной записи, что и продукт X, она работает нормально - компонент создается, и мы даже видим «зеленый шар с плюсом», вращающийся в консоли COM +.
Таким образом, у нас есть две программы, запущенные на одном компьютере под одной и той же учетной записью, и одна может создать экземпляр COM-компонента, а другая - нет. Что могло быть причиной этого?
COAUTHINFO
на стороне клиента? - person sharptooth   schedule 14.07.2011