Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > IEncodingFilterFactory & e_accessdenied


Автор: ASMatic 4.3.2011, 14:14
Добрый день.
Собственно интересно в каких случаях СОМ может вернуть что нету прав на использование объекта?
Как вообще узнать причину? Может вопросы и глупые, но с СОМ не работал практически и понять что к чему трудновато.
Зарание благодарен!

Автор: xvr 4.3.2011, 14:33
Цитата(ASMatic @  4.3.2011,  14:14 Найти цитируемый пост)
Собственно интересно в каких случаях СОМ может вернуть что нету прав на использование объекта?
Если нету прав, вестимо  smile 
COM использует модель системы безопасности Windows (с ACL листами и идентификаторами пользователяей). Любой объект может установить права на доступ к себе (причем разные для разных действий)
Цитата(ASMatic @  4.3.2011,  14:14 Найти цитируемый пост)
Как вообще узнать причину?
Access Denied и есть причина - нет прав на запрошенное действие.

Запустите dcomcnfg в закладке Component Services -> ... -> DCOM Config найдете некоторые настройки


Автор: ASMatic 4.3.2011, 14:56
Цитата(xvr @  4.3.2011,  12:33 Найти цитируемый пост)
Запустите dcomcnfg в закладке Component Services -> ... -> DCOM Config найдете некоторые настройки

Запустил, но найти требуемый интерфейс не выходит...Открыл свойства первого попавшегося, на вкладке Безопасность все не активное - нужны права системы чтоле)) Смотрел под админом...... Ага AIMP норм все - можно изменять, тут понятно - сенкс. Осталось найти IID_IEncodingFilterFactory GUID {70bdde00-c18e-11d0-a9ce-006097942311} , ток не наблюдаю да и не просто среди этих гуидов искать нужный - как опытные люди ищут там то что надо?)
+спасибо за быстрый ответ!

Автор: ASMatic 4.3.2011, 15:17
еще добавлю, мож бывале "поглубже" и можете что-то сказать
На самом деле когда подебажыть решил что там к чему urlmon!CoInternetIsFeatureEnabledInternalEx() возвращает ошибку. Лазит там по всяким тейблам непонятным не находит чегото и ретурнит FALSE. Как понимаю она тут не причём, т.е. IEncodingFilterFactoryl->GetDefaultFilter() непричасна к ошибке, она только не находит значений и возвращает еррор.  Получаеться что виновата тогда CoCreateInstance( CLSID_StdEncodingFilterFac, IID_IEncodingFilterFactory ), которая успешно инитит но не полностью весь интерфейс, а ток часть его. Может стоит вызывать не CoCreateInstance() а что-то более "тонконастраиваемое" like CoCreateInstanceEx() или CoGetInstanceFromIStorage()?? Дабы в итоге иметь ошибку еще на криейт инстанс.. Ну и вопросец - может ли быть такое что на данный момент просто нету доступа к обжекту, например он занят в том же треде, самим тредом, т.е. повторная инициализация или мож CoInitializeEx() был вызван ранее для текущего треда и после того как я вызываю CoInitialze() оно какбы все норм, но в итоге нету доступа к некоторым моментам...
угу, не знаю я СОМ потому уже мысли разные летают в голове по этому поводу, может и бредовые - но ищу выход в безвыходном положении.

Автор: xvr 4.3.2011, 15:27
Цитата(ASMatic @  4.3.2011,  15:17 Найти цитируемый пост)
Может стоит вызывать не CoCreateInstance() а что-то более "тонконастраиваемое" like CoCreateInstanceEx() или CoGetInstanceFromIStorage()??

Нет, это не поможет. А вот настроить security самого COM перед созданием объектов можно - см. http://msdn.microsoft.com/en-us/library/ms693736%28VS.85%29.aspx в частности и http://msdn.microsoft.com/en-us/library/ms693319%28v=VS.85%29.aspx вообще

Автор: ASMatic 4.3.2011, 17:06
Цитата(xvr @  4.3.2011,  13:27 Найти цитируемый пост)
А вот настроить security самого COM перед созданием объектов можно 

да, всетаки приложение настраивает секурити перед работой..
стек:
0012f7cc  6b8bd15c 00000000 ffffffff 00000000
0012f7dc  00000000 00000002 00000003 00000000
0012f7ec  00000000 00000000

dwAuthnLevel  = RPC_C_AUTHN_LEVEL_CONNECT
dwImpLevel  = RPC_C_IMP_LEVEL_IMPERSONATE
dwCapabilities  = EOAC_NONE

пробовал поменять значения в стеке, т.е. изменить параметры 
dwAuthnLevel  = RPC_C_AUTHN_LEVEL_NONE
dwImpLevel  = RPC_C_IMP_LEVEL_IDENTIFY
dwCapabilities  = =EOAC_APPID

приложение выходит, т.е. не проходит ему такая муля, немного почитав и почти нифига не поняв - решил еще пораспрашивать:
RPC_C_IMP_LEVEL_IMPERSONATE - This level of impersonation can be used to access local resources such as files. - чо за ресурсы? - кажеться мне что именно это и не нравиться приложению..хотя поменял все помимо оного - тож вываливаеться
к чему веду - да к тому что если я вручную потом поменяю на дефолтные значения, не вывалиться ли приложение изза этого? - пусть даже на время распаковки поменяю, но тредов то много,а секурити для процесса устанавливаеться..

Добавлено через 8 минут и 9 секунд
тут вот подумал, может по другому мне можно както воспользоваться IEncodingFilterFactory, дабы под эти параметры норм работало?

dwAuthnLevel  = RPC_C_AUTHN_LEVEL_CONNECT
dwImpLevel  = RPC_C_IMP_LEVEL_IMPERSONATE
dwCapabilities  = EOAC_NONE

Автор: ASMatic 4.3.2011, 20:07
попробовал установить  CoInitializeSecurity( NULL, -1, 0, 0, 2, 3, NULL, 0, NULL ); - в тестовом приложении, без результатно, т.е. декомпресит нормально, значит трабла не в этом(
может есть возможность както блокировать определённые методы??

Автор: xvr 4.3.2011, 21:32
Цитата(ASMatic @  4.3.2011,  17:06 Найти цитируемый пост)
RPC_C_IMP_LEVEL_IMPERSONATE - This level of impersonation can be used to access local resources such as files. - чо за ресурсы? 
Это значит, что COM объект на сервере, который был создан по запросу пользователя, будет во всей дальнейшей работе с системой прикидываться этим самым пользователем. Это значит, что если он попытается открыть файл, то система будет проверять права на доступ к файлу от имени пользователя, а не от имени сервера, где COM объект крутится

Цитата(ASMatic @  4.3.2011,  20:07 Найти цитируемый пост)
может есть возможность както блокировать определённые методы?? 

Судя по этому -
Цитата(ASMatic @  4.3.2011,  15:17 Найти цитируемый пост)
urlmon!CoInternetIsFeatureEnabledInternalEx() возвращает ошибку
у вас трабла с настройками безопасности Интернета. Откройте Интернет Эксплорер, в нем Сервис -> Свойства Обозревателя -> [Закладка] Безопасность. Крутите настройки там (urlmon их берет оттуда)


Автор: ASMatic 4.3.2011, 22:49
Цитата(xvr @  4.3.2011,  19:32 Найти цитируемый пост)
у вас трабла с настройками безопасности Интернета

в ИЕ в настройках безопасности настроил все на минимум - ничего не дало(
это что-то с самими СОМ обжектаме, т.к. CoInternetIsFeatureEnabledInternalEx() ничего толком не делает - лазяет по тейблам и возвращает значения в соответствии к ним. ПОдозреваю что тейблы формируются при CoCreateInstance(), как происходит вызов и чо там тот урлмун недоинициализирует не известно...Знаю ток то что пытался наглым образом подменить GetDefaultFilter() т.е. когда она вернула еррор, я делаю S_OK и записываю в указатель на IDataFilter, указатель на сам IDataFilter в урмоне, т.е. тот что должен был вернуть мне GetDefaultFilter(), пытаюсь распаковать но оно E_ABORT возвращает, видать надо еще чего делать с теми обжектаме дабы они воркать стали(
уже в недоумении полном - если работать с ап фф например = все норм работает, а ие выпендриваеться - мож там действительно на перехваченом треде уже криейтнутый инстанс и вот беду делает потому?

Добавлено через 2 минуты и 48 секунд
хотя не
Код

    rc = CoCreateInstance( &CLSID_StdEncodingFilterFac,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           &IID_IEncodingFilterFactory,
                           (LPVOID*)&pEflt );

    rc = CoCreateInstance( &CLSID_StdEncodingFilterFac,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           &IID_IEncodingFilterFactory,
                           (LPVOID*)&pEflt );
    if( rc != S_OK )
        return rc;

    pEflt->lpVtbl->GetDefaultFilter( pEflt,
                             L"gzip",
                             L"text",
                             &pDF );

    pEflt->lpVtbl->GetDefaultFilter( pEflt,
                             L"gzip",
                             L"text",
                             &pDF );


ну и потом дешифровка норм робит..

Автор: ASMatic 8.3.2011, 15:59
в урлмуне проверка на имя процесса стоит, для ие действуют правила с реестра, если нету ключика - присваивается дефаулт значение - запретить.)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)