4

我正在尝试为进程外 COM 服务器(在另一台机器上)编写 C++ 包装器。我希望对班级用户隐藏所有与 COM 相关的肮脏内容。

安全要求迫使我在服务器代理上调用 CoSetSecurityBlanket。那是:

CoCreateInstance(CLSID_OutOfProcServer, &proxy);
CoSetProxyBlanket(proxy);

(我遗漏了很多参数)。此外,我必须在此调用中指定凭据,因为服务器需要本地帐户

现在问题来了。这个服务器有很多返回接口的方法,每个接口都是我这边的一个全新的代理。CoSetProxyBlanket()因此,我每次得到一个都必须打电话。这是我想要完成的事情:

  1. 让我的包装器隐藏 CoSetProxyBlanket 调用(很简单)
  2. 避免将凭据存储在内存中(非常困难!)

到目前为止,我已经尝试使用CoQueryProxyBlanketand将毯子从一个对象复制到另一个对象CoSetProxyBlanket。这不起作用,因为我无法恢复凭据(除非我将它们存储在内存中——我想避免这种情况)。

真正令人沮丧的是,我与服务器建立了经过身份验证的连接。看来我应该能够将其安全上下文复制到新代理中。(或者至少告诉 COM 在创建新代理时为我执行此操作。)有什么方法可以做到这一点,还是我卡在存储凭据上?

4

1 回答 1

0

尝试这个:

  1. 通过调用 LogonUser() 获取模拟令牌并存储此令牌而不是凭据
  2. ImpersonateLoggedOnUser() 与令牌
  3. 设置代理毯,将 authinfo 设置为 NULL
  4. RevertToSelf()

我没试过,只是建议一个想法......

于 2013-05-14T22:26:46.747 回答