使用创建令牌OpenThreadToken()
然后将其传递给CreateProcessAsUser
失败:
1349:令牌的类型不适合其尝试使用。
它在一台机器上成功,但在其他 win2008r2 上失败。
DesiredAccess
传递给的OpenThreadToken
是:
TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY
使用创建令牌OpenThreadToken()
然后将其传递给CreateProcessAsUser
失败:
1349:令牌的类型不适合其尝试使用。
它在一台机器上成功,但在其他 win2008r2 上失败。
DesiredAccess
传递给的OpenThreadToken
是:
TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY
存在 2 TOKEN_TYPE -TokenPrimary
和TokenImpersonation
. CreateProcessAsUser只接受TokenPrimary
。从另一方面来说,线程如果有令牌 - 总是有TokenImpersonation
令牌类型。所以OpenThreadToken返回的令牌是TokenImpersonation
你需要调用并将这个新令牌传递给DuplicateTokenEx
(.., TokenPrimary, );
CreateProcessAsUser
- - 编辑 - -
真正从 Windows 7 开始,我们可以使用 和TokenImpersonation
作为参数,CreateProcessAsUser
尽管在 MSDN 中写了关于主令牌的内容。但在 xp/2003 中使用了另一个代码CreateProcessAsUser
- 直接调用NtSetInformationProcess(,ProcessAccessToken,);
-> PspSetPrimaryToken
-> PspAssignPrimaryToken
->STATUS_BAD_TOKEN_TYPE
目标线程在调用时正在模拟,所以你得到了错误的令牌。使用OpenProcessToken()而不是OpenThreadToken()应该可以解决问题。如果由于某种原因您只有线程 ID 而没有进程 ID,GetProcessIdOfThread()将弥补差距。
或者,如果您出于某种原因想要使用模拟令牌,则必须使用DuplicateTokenEx()将其转换为主令牌。但这不太可能是您想要做的,因为它引入了竞争条件,因为您通常无法知道目标线程何时冒充正确的用户。此外,如果线程被证明是在匿名级别模拟,它根本不起作用。
(这种竞争条件可能也是它似乎在某些机器上工作但在其他机器上不起作用的原因,尽管也可能是模拟只发生在某些 Windows 版本上。)