我有一些曾经工作的代码,但最近停止了。它位于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错误?我必须通过哪些安全保障才能使其发挥作用?
答案 0 :(得分:2)
受限制的进程没有管理员权限。这几乎就是练习的重点 - 阅读器X从其令牌中删除尽可能多的权利,这样如果它被计算,那么你的计算机就没有。
(这基本上就是UAC的工作方式,一旦禁用了管理员组,你必须转到内核才能获得重新启用管理员组的权限。)
基本上,您需要查看Reader X具有的priv,并确保您的组件可以与这些权限一起使用。 Process Monitor是你的朋友 - 只需过滤DENIED,问题就会突然出现在你身上!