使用1349失败的CreateProcessAsUser:令牌的类型不适合其尝试使用

时间:2016-09-28 09:08:25

标签: windows winapi windows-authentication windows-security createprocessasuser

使用OpenThreadToken()创建令牌然后将其传递给CreateProcessAsUser失败了:

  

1349:令牌的类型不适合其尝试使用。

在一台机器上成功但在其他win2008r2上失败。

传递给DesiredAccess的{​​{1}}是: OpenThreadToken

2 个答案:

答案 0 :(得分:1)

存在2 TOKEN_TYPE - TokenPrimaryTokenImpersonationCreateProcessAsUser仅接受TokenPrimary。从另一方面来说,线程如果有令牌 - 总是有TokenImpersonation令牌类型。因此OpenThreadToken返回的令牌为TokenImpersonation,您需要致电DuplicateTokenEx (.., TokenPrimary, );并将此新令牌传递给CreateProcessAsUser

---编辑---

真正从Windows 7开始,我们可以使用TokenImpersonation作为CreateProcessAsUser的参数,尽管在MSDN中写的是关于主令牌的。但在xp / 2003中使用了CreateProcessAsUser的另一个代码 - 直接调用NtSetInformationProcess(,ProcessAccessToken,); - > PspSetPrimaryToken - > PspAssignPrimaryToken - > STATUS_BAD_TOKEN_TYPE

答案 1 :(得分:0)

目标主题在通话时模拟,因此您获得了错误的令牌。使用OpenProcessToken()代替OpenThreadToken()可以解决问题。如果由于某种原因你只有线程ID而不是进程ID,那么GetProcessIdOfThread()将弥补差距。

或者,如果您有某些理由想要使用模拟令牌,则必须使用DuplicateTokenEx()将其转换为主令牌。但这不太可能是您想要做的,因为它引入了竞争条件,因为您通常无法知道目标线程何时模仿正确的用户。此外,如果线程在匿名级别模仿,它将无法工作。

(这种竞争条件可能也是为什么它似乎在某些机器上工作而不是其他机器,尽管也可能只是在某些Windows版本上进行模拟。)