PsImpersonateClient 函数 (ntifs.h)

PsImpersonateClient 例程会导致服务器线程模拟客户端。

语法

NTSTATUS PsImpersonateClient(
  [in, out] PETHREAD                     Thread,
  [in]      PACCESS_TOKEN                Token,
  [in]      BOOLEAN                      CopyOnOpen,
  [in]      BOOLEAN                      EffectiveOnly,
  [in]      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
);

参数

[in, out] Thread

指向要模拟客户端的服务器线程的指针。

[in] Token

指向要分配为模拟令牌的令牌的指针。 此令牌可以是主令牌或模拟令牌。 设置为 NULL 以结束模拟。

[in] CopyOnOpen

指定是否可以直接打开令牌。 设置为 TRUE 可指定无法直接打开令牌。 在这种情况下,必须复制令牌,并改用重复令牌。 设置为 FALSE 以允许直接打开令牌。

[in] EffectiveOnly

设置为 FALSE 以允许服务器启用当前在客户端安全上下文中禁用的组和特权,否则为 TRUE

[in] ImpersonationLevel

一个SECURITY_IMPERSONATION_LEVEL值,该值指定服务器访问令牌的模拟级别。

返回值

PsImpersonateClient 返回STATUS_SUCCESS或相应的 NTSTATUS 值,如下所示:

返回代码 说明
STATUS_ACCESS_DENIED
由于作业限制,无法模拟客户端。
STATUS_NO_MEMORY
内存不足,无法完成操作。

注解

PsImpersonateClient 会导致指定的服务器线程模拟指定的客户端。

调用 PsImpersonateClient 时,服务器线程可能已经在模拟客户端。 如果是这种情况,则表示该客户端的令牌上的引用计数将递减。 若要保留此令牌以供以后使用,驱动程序应在调用 PsImpersonateClient 之前调用 PsReferenceImpersonationToken,并保存 PsReferenceImpersonationToken 返回的指针。

若要结束新的模拟并将服务器线程返回到上一个模拟,请再次调用 PsImpersonateClient ,并传递 Token 参数的保存指针。 若要结束所有模拟,请调用 PsRevertToSelf 例程。

否则,若要结束模拟并将服务器线程返回到其原始安全上下文 (即由其主标记表示) ,请再次调用 PsImpersonateClient,为 Token 参数传递 NULL 指针。

如果线程已在模拟或存在作业限制, PsImpersonateClient 例程可能无法成功将服务器线程返回到以前的模拟。

例程通过检查各种条件(包括以下内容)来确保客户端模拟是否可以实际发生:

  • 调用方传递的令牌没有匿名身份验证 ID
  • 从服务器线程引用的进程令牌和给定令牌具有相等的安全标识符 (SID)
  • 两个令牌均不受限制

如果未满足任何条件,则例程会创建传递给调用的现有令牌的副本,并将新复制的令牌分配为模拟令牌,尽管安全模拟级别有限;也就是说,服务器线程只能获取有关客户端的信息。 如果无法复制令牌,则例程会失败并显示 NTSTATUS 代码。

提升不受信任的用户线程的权限状态 (获取用户的线程并模拟 LocalSystem(例如) )是非常不安全的。 如果不受信任的用户线程具有其权限,则用户可以在提升线程令牌后获取该令牌,并破坏整个系统的安全性。

在需要更高特权状态的情况下,应将任务调度到工作队列,在该队列中,系统工作线程 可以安全地处理任务。 这样就无需模拟。

SeImpersonateClientEx 例程可用于使线程模拟用户。

有关安全性和访问控制的详细信息,请参阅 面向驱动程序开发人员的 Windows 安全模型 以及 Windows SDK 中有关这些主题的文档。

要求

要求
最低受支持的客户端 Windows XP
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) PowerIrpDDis (wdm)

另请参阅

PsGetCurrentThread

PsReferenceImpersonationToken

PsRevertToSelf

SECURITY_IMPERSONATION_LEVEL

SeImpersonateClientEx