E_ACCESSDENIED на CoCreateInstance, где он работал - PullRequest
4 голосов
/ 17 марта 2011

У меня есть код, который работал, но недавно остановился.Он находится в плагине Adobe Reader, и в последней версии Reader есть «защищенный режим», который вызывает мою проблему.

Мой плагин может загружать некоторые из моих обычных библиотек, которые загружаются в процессе:

MyNormalLib::IMyClassPtr foo;
HRESULT hr = foo.CreateInstance(__uuidof(MyNormalLib::MyClass));

Но когда я пытаюсь получить com-указатель на мой сервис (работающий на той же машине):

MyOtherLib::IMyServicePtr bar;
HRESULT hr = bar.CreateInstance(__uuidof(MyOtherLib::MyService));

Я получаю E_ACCESSDENIED для моего HRESULT.

Это используетсяработать хорошо, пока не появился Adobe Reader X.Без защищенного режима Adobe работает нормально и все работает.В защищенном режиме Adobe запускает другой процесс чтения с некоторыми ограничениями.Глядя на это с помощью Process Explorer, я вижу, что на вкладке Security для родительского процесса Reader почти все установлено на Mandatory;но у дочернего процесса Reader большинство групп установлено на «Запретить, Обязательный», некоторые «Обязательные, Ограниченные», некоторые просто Обязательные.Если это имеет значение, я могу предоставить более подробную информацию.

Все процессы (мой сервис и оба Reader) выполняются как один и тот же пользователь - я.У меня есть права администратора, если это имеет значение.

Что может вызвать ошибку AccessDenied при попытке доступа к моей собственной службе?Через какие обручи безопасности я должен прыгнуть, чтобы заставить это работать?

1 Ответ

2 голосов
/ 18 марта 2011

Запрещенный процесс не имеет прав администратора. В этом и заключается суть упражнения - Reader X теряет столько прав, сколько может, из своего токена, чтобы, если он pwned, ваш компьютер не стал.

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

По сути, вам нужно взглянуть на привилегии, которые есть у Reader X, и убедиться, что ваш компонент может использоваться с этими разрешениями. Process Monitor - ваш друг - просто отфильтруйте DENIED, и проблемы возникнут прямо у вас!

...