2010-06-03 83 views
5

我已閱讀關於CreateProcessAsUser堆棧溢出的所有帖子,並且有很少解決的問題,所以我沒有屏住這一口氣。但似乎我肯定錯過了一些東西,所以它可能很容易。LogonUser - > CreateProcessAsUser從系統服務

目標操作系統是Windows XP。我有一個作爲「本地系統」運行的服務,我想從中創建一個以不同用戶身份運行的進程。對於那個用戶,我有用戶名和密碼,所以LogonUser會很好,我爲用戶獲得一個令牌(在這種情況下,是一個管理員帳戶)。然後我嘗試使用該令牌調用CreateProcessAsUser,但它失敗,因爲該令牌沒有附帶SeAssignPrimaryTokenPrivilege - 但是,它確實有SeIncreaseQuotaPrivilege。 (我使用GetTokenInformation轉儲與該令牌關聯的所有特權。)根據CreateProcessAsUser的MSDN頁面,您需要兩種特權才能成功調用CreateProcessAsUser。

它也說你不需要SeAssignPrimaryTokenPrivilege,如果你傳遞給CreateProcessAsUser()的令牌是「調用進程的主令牌的受限制版本」,我可以使用CreateRestrictedToken()創建它,但隨後它將與本地系統用戶相關聯,而不是我嘗試運行此過程的目標用戶。

那麼,我將如何創建一個登錄令牌既是調用進程的主令牌的受限版本,又與不同的用戶關聯?謝謝!

注意,這裏我們就不再需要用戶互動 - 這一切都無人看管的 - 因此沒有必要做這樣的東西抓WINSTA0等

+1

GetProcessAsUser失敗後GetLastError返回什麼? – Anders 2010-06-03 18:32:10

+0

你解決了嗎?我也需要一個解決方案:) – AgentFire 2013-05-31 07:56:32

+0

谷歌Chrome瀏覽器的各位也解決了這個問題,並且使用了一個存在於XP中的未公開的啓動服務器API。如果您可以爲想要創建的用戶獲取一個令牌過程如下,你可以在這裏遵循下面的代碼:http://src.chromium.org/chrome/trunk/src/remoting/host/win/launch_process_with_token.cc – 2013-07-19 21:30:07

回答

4

SE_ASSIGNPRIMARYTOKEN_NAME是一種特權,你可以在你的進程/線程能夠與OpenProcessToken/OpenThreadToken + LookupPrivilegeValue + AdjustTokenPrivileges(這是很容易與TOKEN_ASSIGN_PRIMARY混淆和MSDN說,你既需要一個主令牌附加到一個進程)

在此XP:SP2的機器,只調用LogonUser的(... ,LOGON32_LOGON_INTERACTIVE,...)+ CreateProcessAsUser工作得很好,沒有搞亂任何特權(使用僞造的cmd.exe服務,但不應該tter)

這句話在MSDN:

如果必要的權限不會 已經啓用,CreateProcessAsUser 使他們的 呼叫

的持續時間和事實,你是作爲系統運行,並應該能夠啓用任何特權,導致我相信這個指派主要的東西不是問題。

+0

你說得對,原來是紅鯡魚。這是稍後的有用的知識。謝謝。 – 2010-06-07 17:04:11