c – CoCreateInstance上的E_ACCESSDENIED,它曾经在那里工作

我有一些曾经工作的代码,但最近停止了.它位于Adobe Reader插件中,最新的Reader版本具有“保护模式”,这会导致我的问题.

我的插件可以加载一些正常的dll,它在进程中加载​​:

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

但是当我尝试获取指向我的服务的com指针(在同一台机器上运行)时:

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

我的HRESULT得到了E_ACCESSDENIED.

这曾经很好用,直到Adobe Reader X出现.没有保护模式,Adobe正常运行,一切正常.使用保护模式,Adobe会生成另一个Reader进程,但会对其进行一些限制.通过Process Explorer查看,我可以看到父Reader进程的Security选项卡几乎都设置为Mandatory;但是孩子的阅读过程中大多数群体设置为“拒绝,强制”,一些“强制性,限制性”,有些只是强制性的.如果这很重要,我可以提供更多细节.

所有进程(我的服务和两个Reader)都以同一个用户身份运行 – 我.如果重要的话,我有管理权.

尝试访问我自己的服务时,什么可能导致AccessDenied错误?我必须通过哪些安全箍来实现这一目标?

最佳答案 受限制的进程没有管理员权限.这就是练习的重点 – 读者X从其令牌中删除尽可能多的权利,这样如果它被计算,那么你的计算机就不会.

(这基本上就是UAC的工作原理,一旦禁用了管理员组,你必须转到内核才能获得重新启用管理员组的权限).

基本上,您需要查看Reader X具有的priv,并确保您的组件可以与这些权限一起使用. Process Monitor是你的朋友 – 只需过滤DENIED,问题就会突然出现在你面前!

点赞