4

我有一些过去可以工作的代码,但最近停止了。它在一个 Adob​​e Reader 插件中,最新的 Reader 版本有一个“保护模式”,这导致了我的问题。

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

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

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

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

我得到E_ACCESSDENIED了我的 HRESULT。

在 Adob​​e Reader X 出现之前,这一直很好用。如果没有保护模式,Adobe 可以正常运行,一切正常。在保护模式下,Adobe 会生成另一个 Reader 进程,但对其有一些限制。使用 Process Explorer 查看此内容,我可以看到父 Reader 进程的安全选项卡几乎所有内容都设置为强制;但是子阅读器进程将大多数组设置为“拒绝,强制”,一些“强制,限制”,有些只是强制。如果这很重要,我可以提供更多细节。

所有进程(我的服务和两个 Reader)都作为同一个用户运行——我。我有管理员权限,如果这很重要。

尝试访问我自己的服务时,什么会导致 AccessDenied 错误?我必须跳过哪些安全圈才能使其正常工作?

4

1 回答 1

2

受限进程没有管理员权限。这几乎就是练习的重点——Reader X 从其令牌中删除尽可能多的权利,这样如果它被 pwned 你的计算机就不会。

(这基本上也是 UAC 的工作方式,一旦禁用它,您必须转到内核以获得重新启用管理员组的权限)。

基本上,您需要查看 Reader X 拥有的权限,并确保您的组件可以与这些权限一起使用。Process Monitor 是您的朋友 - 只需过滤 DENIED,问题就会立即出现在您身上!

于 2011-03-18T20:55:34.707 回答