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

Мы столкнулись с довольно странной проблемой с нашим 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-компонента, а другая - нет. Что могло быть причиной этого?


person sharptooth    schedule 13.07.2011    source источник
comment
Мне ооочень любопытно, почему за это проголосовали против.   -  person sharptooth    schedule 13.07.2011
comment
Ах, эти бесконечные отказы в доступе к COM. Я сочувствую вам ... У меня нет никаких реальных предложений, но мне интересно: 1) Вы знаете, как X создает экземпляр? В COAUTHINFO могут быть какие-то странности. 2) Какие-нибудь изменения, если X запускается от имени администратора? 3) У вашего Hello World такая же разрядность, как у X? (не имеет значения, но кто знает).   -  person eran    schedule 13.07.2011
comment
@eran: Понятия не имею, как X создает экземпляр. И X, и Hello world запускаются от имени администратора и имеют одинаковую разрядность.   -  person sharptooth    schedule 13.07.2011
comment
Может быть, тогда вам стоит попробовать наоборот - создать нетривиальное тестовое приложение, поиграть с настройками безопасности при создании экземпляра и посмотреть, что приведет к отказу. Очевидно, вам все равно придется найти решение, поскольку вы не можете изменить X, но оно может указать вам на конкретную настройку.   -  person eran    schedule 13.07.2011
comment
@eran: Есть ли где-нибудь фрагменты кода, показывающие что-нибудь похожее на то, что вы предлагаете мне сделать?   -  person sharptooth    schedule 14.07.2011
comment
Я не программист на C #, поэтому понятия не имею, как это можно сделать на C #. В C / C ++ CoCreateInstanceEx получает параметр COSERVERINFO, который имеет член COAUTHINFO. Используя COAUTHINFO, вы можете переопределить различные значения по умолчанию, такие как уровень аутентификации и уровень олицетворения. Может быть, какая-то комбинация не подойдет для COM +.   -  person eran    schedule 14.07.2011
comment
@eran: Хорошо, C ++ тоже подойдет. Знаете ли вы какие-нибудь фрагменты кода, которые делают что-нибудь разумное с COAUTHINFO на стороне клиента?   -  person sharptooth    schedule 14.07.2011
comment
Я знаю, что это не объясняет, почему он работает в вашем примере проекта, но на всякий случай - вы пытались изменить разрешения активации и запуска вашего компонента com +?   -  person sternr    schedule 18.07.2011
comment
@ user4537: Нет, у них есть значения по умолчанию.   -  person sharptooth    schedule 18.07.2011


Ответы (1)


Думаю, вам не хватает конфигурации приложения.

Итак, две вещи, чтобы это работало. 1 Ваше приложение должно быть скомпилировано как «Com Visible». 2 Вам необходимо зарегистрировать компонент com (если еще не зарегистрирован)

Перейдите в Пуск -> Администрирование -> Службы компонентов. Разверните «Службы компонентов», «Компьютеры», «Мой компьютер», «Конфигурация DCOM». Прокрутите вниз и найдите приложение. Право -> Щелкните -> Свойства и выберите вкладку Безопасность. Здесь вы увидите некоторые параметры - первый блок Разрешения на запуск и активацию - убедитесь, что установлен переключатель «Настроить», и нажмите «Изменить». Теперь дайте учетной записи, которую вы используете, разрешения на запуск, активацию, а также удаленный запуск / активацию. Перезагрузите компьютер (или перезапустите службу / приложение), и, надеюсь, все заработает.

person bleepzter    schedule 02.08.2011