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 值,如下所示:
返回代码 | 描述 |
---|---|
|
由于作业限制,无法模拟客户端。 |
|
内存不足,无法完成作。 |
言论
PsImpersonateClient 会导致指定的服务器线程模拟指定的客户端。
调用 PsImpersonateClient 时,服务器线程可能已经模拟客户端。 如果是这种情况,则表示客户端递减的令牌的引用计数。 若要保留此令牌供以后使用,驱动程序应在 调用 psImpersonateClient 之前调用 PsReferenceImpersonationToken,并保存由 PsReferenceImpersonationToken返回的指针。
若要结束新的模拟并将服务器线程返回到以前的模拟,请再次调用 PsImpersonateClient,并传递 Token 参数的已保存指针。 若要结束所有模拟,请调用 PsRevertToSelf 例程。
否则,若要结束模拟并将服务器线程返回到其原始安全上下文(即由其主令牌表示),请再次调用 PsImpersonateClient,并传递 Token 参数的 NULL 指针。
如果线程已模拟或存在作业限制,则 psImpersonateClient 例程 无法成功将服务器线程返回到以前的模拟。
例程通过检查各种条件(包括以下内容)确保客户端模拟是否实际发生:
- 调用方传递的令牌没有匿名身份验证 ID
- 从服务器线程引用的进程令牌和给定令牌具有相同的安全标识符(SID)
- 两个令牌均不受限制
如果未满足任何条件,则例程会创建传递给调用的现有令牌的副本,并将新复制的令牌分配为模拟令牌,尽管具有有限的安全模拟级别;也就是说,服务器线程只能获取有关客户端的信息。 如果无法复制令牌,则例程会失败并出现 NTSTATUS 代码。
提升不受信任的用户线程的特权状态(例如,获取用户的线程并模拟 LocalSystem)是非常不安全的。 如果引发不受信任的用户线程的权限,则用户可以在提升线程令牌并颠覆整个系统的安全性之后获取该线程令牌。
如果需要更高的特权状态,应将任务调度到工作队列,其中任务可由系统工作线程安全地处理。 这样就不需要模拟了。
SeImpersonateClientEx 例程可用于使线程模拟用户。
有关安全和访问控制的详细信息,请参阅适用于驱动程序开发人员 Windows 安全模型,以及有关 Windows SDK 中这些主题的文档。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP |
目标平台 | 普遍 |
标头 | ntifs.h (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport),PowerIrpDDis(wdm) |