【发布时间】:2019-03-21 20:34:03
【问题描述】:
当主线程模拟客户端时,我的代码创建一个线程并使用SetThreadToken 为其分配模拟令牌。然后主线程关闭令牌。
具体来说,主线程是这样做的:
- 使用
LogonUser获取主令牌。 - 使用
DuplicateToken从主令牌获取模拟令牌。 - 致电
ImpersonateLoggedOnUser。 - 产生一个辅助线程并在具有模拟令牌的线程上调用
SetThreadToken。 -
RevertToSelf。 -
CloseHandle模拟和主令牌。
此时,辅助线程仍在运行。即使令牌句柄已在主线程中关闭,模拟令牌是否仍可用于辅助线程?
【问题讨论】:
-
是的,当您将线程分配给令牌时(通过
SetThreadToken) - 将向此令牌添加额外的引用。因此当你关闭它句柄时它不会被破坏。 -
谢谢。但是对于
SetThreadToken,我需要一个模拟令牌,所以无论如何我都必须DuplicateToken。主线程模拟用户,因为它也必须代表他们做其他事情。 -
明白。任何对象(以及令牌)在存在对其的引用之前都保持有效。对象的句柄这是参考。当您将令牌分配给线程时 - 将向此令牌对象添加额外的引用。结果你可以关闭句柄。令牌将一直有效,直到您没有为您的工作线程分配另一个令牌或该线程不退出