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