0

使用OpenThreadToken()創建一個令牌,然後將它傳遞給CreateProcessAsUser與失敗:CreateProcessAsUser與1349失敗:該類型的令牌不適合其企圖使用

1349:類型的令牌是不合適的其企圖使用。

它在一臺機器上成功,但在其他win2008r2上失敗。傳遞給OpenThreadToken

DesiredAccess是: TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY

+0

不OpenThreadToken成功嗎?如果不是GetLastError的結果是什麼? –

+0

是的,OpenThreadToken成功了。 – user5327778

回答

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

+0

但是我只在一臺機器上看到這個問題,它傳遞給其他機器。是否有任何註冊表項可能會在該機器上創建問題。 – user5327778

+0

這裏的任何註冊表項無關。由OpenThreadToken返回的標記不能在任何地方與CreateProcessAsUser一起使用(可能僅限於xp,其中CreateProcessAsUser的另一個實現 - 首先創建進程而不是嘗試爲其分配標記)。並且您不顯示自己的代碼 – RbMm

+0

除了DuplicateTokenEx()將模擬標記轉換爲主標記之外,還有其他方法嗎? – user5327778

0

目標線程模擬在調用的時候,所以你得到了錯誤的令牌。使用OpenProcessToken()而不是OpenThreadToken()應該可以解決問題。如果由於某種原因您只有線程ID而不是進程ID,則GetProcessIdOfThread()將填補空白。

或者,如果您有某些原因希望使用模擬令牌,則必須使用DuplicateTokenEx()將其轉換爲主令牌。但是這不太可能是你想要做的,因爲它引入了競爭條件,因爲你通常無法知道目標線程何時冒充正確的用戶。而且,如果線程變成匿名級別的模擬,它根本無法工作。

(這種爭用情況大概也是爲什麼它似乎是工作在某些機器上,但不是別人,但它也可能是冒充只發生在特定的Windows版本。)

相關問題