ImpersonateLoggedOnUser 函数允许调用线程模拟登录用户的安全上下文。 用户由令牌句柄表示。
Syntax
BOOL ImpersonateLoggedOnUser(
  [in] HANDLE hToken
);
参数
[in] hToken
表示已登录用户的主访问令牌或模拟 访问令牌 的句柄。 这可以是调用 LogonUser、CreateRestrictedToken、DuplicateToken、DuplicateToken、DuplicateTokenEx、OpenProcessToken 或 OpenThreadToken 函数返回的令牌句柄。 如果 hToken 是 主令牌的句柄,则令牌必须具有 TOKEN_QUERY 和 TOKEN_DUPLICATE 访问权限。 如果 hToken 是 模拟令牌的句柄,则令牌必须具有 TOKEN_QUERY 和 TOKEN_IMPERSONATE 访问权限。
返回值
如果函数成功,则返回值为非零。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
注解
模拟持续到线程退出或调用 RevertToSelf 为止。
调用线程不需要具有任何特定 权限 来调用 ImpersonateLoggedOnUser。
如果对 ImpersonateLoggedOnUser 的调用失败,则不会模拟客户端连接,并且客户端请求是在进程的安全上下文中进行的。 如果进程作为高特权帐户(如 LocalSystem)或管理组的成员运行,则用户可能能够执行否则不允许执行的作。 因此,请务必始终检查调用的返回值,如果调用失败,则引发错误;不要继续执行客户端请求。
所有模拟函数(包括 ImpersonateLoggedOnUser) 都允许请求的模拟(如果以下任一为 true):
- 调用方具有 SeImpersonatePrivilege 特权。
- 进程(或调用方登录会话中的另一个进程)通过 LogonUser 或 LsaLogonUser 函数使用显式凭据创建了令牌。
- 经过身份验证的标识与调用方相同。
重要
令牌必须具有 SecurityImpersonation 的模拟级别或更高版本才能成功模拟。 即使调用方具有 SeImpersonatePrivilege,具有 SecurityIdentification 或 SecurityAnonymous 级别的令牌也不能用于模拟。 SecurityIdentification 令牌允许身份验证和 ACL 检查,但不允许模拟。
模拟级别要求
此行为因令牌的模拟级别而异:
- SecurityAnonymous:服务器无法获取客户端标识信息,并且无法模拟客户端。
- SecurityIdentification:服务器可以获取客户端的标识并执行访问验证,但无法模拟客户端。 这是许多方案的默认级别。
- SecurityImpersonation:服务器可以模拟本地系统上客户端的安全上下文。 这是 ImpersonateLoggedOnUser 成功所需的最低级别。
- SecurityDelegation:服务器可以在远程系统上以及本地模拟客户端。
具有 SP1 和更早版本的 Windows XP: 不支持 SeImpersonatePrivilege 特权。
有关模拟的详细信息,请参阅 客户端模拟。
要求
| Requirement | 价值 | 
|---|---|
| 最低支持的客户端 | Windows XP [仅限桌面应用] | 
| 支持的最低服务器 | Windows Server 2003 [仅限桌面应用] | 
| 目标平台 | Windows操作系统 | 
| Header | securitybaseapi.h (包括 Windows.h) | 
| Library | Advapi32.lib | 
| DLL | Advapi32.dll |