ImpersonateLoggedOnUser 函数 (securitybaseapi.h)

ImpersonateLoggedOnUser 函数允许调用线程模拟登录用户的安全上下文。 用户由令牌句柄表示。

Syntax

BOOL ImpersonateLoggedOnUser(
  [in] HANDLE hToken
);

参数

[in] hToken

表示已登录用户的主访问令牌或模拟 访问令牌 的句柄。 这可以是调用 LogonUserCreateRestrictedTokenDuplicateToken、DuplicateToken、DuplicateTokenExOpenProcessTokenOpenThreadToken 函数返回的令牌句柄。 如果 hToken主令牌的句柄,则令牌必须具有 TOKEN_QUERYTOKEN_DUPLICATE 访问权限。 如果 hToken模拟令牌的句柄,则令牌必须具有 TOKEN_QUERYTOKEN_IMPERSONATE 访问权限。

返回值

如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError

注解

模拟持续到线程退出或调用 RevertToSelf 为止。

调用线程不需要具有任何特定 权限 来调用 ImpersonateLoggedOnUser

如果对 ImpersonateLoggedOnUser 的调用失败,则不会模拟客户端连接,并且客户端请求是在进程的安全上下文中进行的。 如果进程作为高特权帐户(如 LocalSystem)或管理组的成员运行,则用户可能能够执行否则不允许执行的作。 因此,请务必始终检查调用的返回值,如果调用失败,则引发错误;不要继续执行客户端请求。

所有模拟函数(包括 ImpersonateLoggedOnUser) 都允许请求的模拟(如果以下任一为 true):

  • 调用方具有 SeImpersonatePrivilege 特权。
  • 进程(或调用方登录会话中的另一个进程)通过 LogonUserLsaLogonUser 函数使用显式凭据创建了令牌。
  • 经过身份验证的标识与调用方相同。

重要

令牌必须具有 SecurityImpersonation 的模拟级别或更高版本才能成功模拟。 即使调用方具有 SeImpersonatePrivilege,具有 SecurityIdentificationSecurityAnonymous 级别的令牌也不能用于模拟。 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

另请参阅

客户端/服务器访问控制函数

客户端/服务器访问控制概述

CreateProcessAsUser

CreateRestrictedToken

DuplicateToken

DuplicateTokenEx

LogonUser

OpenProcessToken

OpenThreadToken

RevertToSelf