客户端模拟(授权)
模拟 是线程使用与拥有线程的进程不同的安全信息执行的能力。 通常,服务器应用程序中的线程模拟客户端。 这样,服务器线程就可以代表该客户端访问服务器上的对象或验证对客户端自己的对象的访问。
Microsoft Windows API 提供以下函数来开始模拟:
- DDE 服务器应用程序可以调用 DdeImpersonateClient 函数来模拟客户端。
- 命名管道服务器可以调用 ImpersonateNamedPipeClient 函数。
- 可以调用 ImpersonateLoggedOnUser 函数来模拟登录用户的 访问令牌的安全上下文。
- ImpersonateSelf 函数使线程能够生成其自己的访问令牌的副本。 当应用程序需要更改单个线程的安全上下文时,这非常有用。 例如,有时只有一个进程线程需要启用 特权。
- 可以调用 SetThreadToken 函数,使目标线程在指定 模拟令牌的安全上下文中运行。
- Microsoft远程过程调用 (RPC) 服务器应用程序可以调用 RpcImpersonateClient 函数来模拟客户端。
- 安全包 或应用程序服务器可以调用 ImpersonateSecurityContext 函数来模拟客户端。
对于大多数模拟,模拟线程可以通过调用 RevertToSelf 函数还原到自己的安全上下文。 例外情况是 RPC 模拟,RPC 服务器应用程序在其中调用 RpcRevertToSelf 或 RpcRevertToSelfEx 还原为其自己的安全上下文。
注意:如果要从 Win32 服务模拟用户,并且调用依赖于用户环境变量的 API,则可能需要先调用 RegDisablePredefinedCache,然后才能进行模拟。