首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetThreadToken()是否使模拟令牌保持活动状态?

SetThreadToken()是否使模拟令牌保持活动状态?
EN

Stack Overflow用户
提问于 2018-10-17 08:13:52
回答 1查看 1.1K关注 0票数 0

当主线程模拟客户端时,我的代码创建一个线程,并使用SetThreadToken为它分配模拟令牌。然后主线程关闭令牌。

具体来说,主线程是这样做的:

  1. 使用LogonUser获取主令牌。
  2. 使用DuplicateToken从主令牌获取模拟令牌。
  3. 打给ImpersonateLoggedOnUser
  4. 生成一个次要线程,并使用模拟令牌在线程上调用SetThreadToken
  5. RevertToSelf
  6. 模拟和主令牌上的CloseHandle

此时,辅助线程仍在运行。即使令牌句柄已在主线程中关闭,模拟令牌是否仍可用于辅助线程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-17 08:52:08

windows内核使用对对象的引用计数。TOKEN也是对象。当您将令牌分配给线程(通过SetThreadToken)时,指向TOKEN对象的指针存储在ETHREAD对象和添加到TOKEN对象的附加引用中。当然,内核不能依赖于关闭您或不依赖于TOKEN对象的原始句柄(引用)。这是一般的指针计数规则--如果A将指向B的指针存储在self中--它会添加对B的引用,因为它将在A使用B之前有效。该令牌将有效,直到您的线程不模拟另一个令牌,或结束模拟或退出。无论如何,在将令牌分配给线程之后,您可以关闭它的句柄-令牌仍然有效。

如果存在兴趣,内部SetThreadToken是如何工作的:

SetThreadToken使用ThreadImpersonationToken信息类调用NtSetInformationThread。在内核端,实现调用PsAssignImpersonationToken -这个api在ntifs.h中声明。它是实现 打电话 PsImpersonateClientreference传递的令牌。因此,它成为分配给线程的有效的util。

当调用PsImpersonateClient时,服务器线程可能已经在模拟客户端。如果是这样的话,表示该客户端的令牌上的引用计数就会减少。

但是无论如何--我们不需要这种内部知识--需要一般的思考理解--对象引用计数。如果指向线程中保存的令牌的指针--当然,这个令牌必须有效,直到线程使用为止。因此,它引用了。当线程停止使用此令牌时(更改指针或退出)-取消引用令牌

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52850203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档