2010-02-05 63 views
2

有什麼辦法來運行以管理員身份運行一個進程普通權限的另一個進程創建具有普通權限的進程?從具有更高權限的流程中,我希望啓動一個普通權限的流程,就像它從資源管理器啓動一樣。我試圖模仿,但我沒有工作。在Linux上從管理員過程

回答

2

使用CreateProcessAsUser()。詳細信息在鏈接的SDK文檔中。

+0

你從哪裏得到令牌? – Anders 2010-02-14 21:57:20

+0

@Anders - LogonUser()返回該標記。 – 2010-02-14 22:25:02

+0

你從哪裏獲得LogonUser的用戶名和密碼? – Anders 2010-02-14 23:14:34

1

不,這是不可能(有幾個哈克的方式做到這一點(注入資源管理器,任務調度,SaferAPI + MediumIL等),但他們都不在所有情況下工作)

+3

問題在於,當winlogon創建令牌時,很難將令牌分割回原來的樣子。你最好的選擇是有一箇中等程度的IL應用程序來提升你的應用程序。當您想以標準用戶身份執行代碼時,只需將請求發送給中型IL啓動應用程序。 – 2010-02-07 20:33:46

1

這似乎是一個很好的方式做到這一點,只要你不關心,其中殼牌未運行的情況下(例如,可能是一些終端服務的應用程序只設置,也許,但我不知道):

http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/

它得到Explorer.exe的界面,應該在用戶的正常上下文中運行,並要求Explorer執行代表一個命令。這隻需使用簡單的文檔化的COM接口即可完成,而不必混淆過程令牌或代碼/ DLL注入。

0

如果可能,請使用Larry Osterman的解決方案(在Anders'answer的評論中),即有一個沒有提升的父進程,並從此處啓動升級進程和非升級進程。

如果這是不可能的,也應該工作在幾乎所有情況下的做法,但它通常是更多的麻煩比它的價值:

  • 安裝並啓動系統服務,配置爲運行作爲本地系統。給它的遠程桌面會話ID,例如,通過命令行參數或註冊表設置,以及您的進程ID和你要運行的命令行。

  • 從系統服務,使用GetTokenInformation與TokenLinkedToken獲得從目標過程中的鏈接的標記。您必須從系統服務執行此操作,因爲您需要SE_TCB_NAME獲取可用的令牌。 (此限制似乎沒有記錄,但與Windows中令牌的行爲一致。)

  • 或者,如果沒有鏈接的令牌,請使用WTSQueryUserToken獲取用戶令牌的副本。我相信這總是讓你有限的令牌(如果有的話),但如果你想成爲安全的,你可以檢查它是否是升高還是有限令牌使用GetTokenInformation和TokenElevationType;如果它是一個提升的標記,則可以使用TokenLinkedToken獲取有限的標記。

  • 如果沒有鏈接的標記(TokenElevationTypeDefault),你應該使用令牌原樣。這可能發生是因爲用戶不是管理員,還是因爲UAC被禁用,全局或因爲用戶登錄使用內置的Administrator帳戶。如果用戶不是管理員,那麼令牌已經適用。如果UAC被禁用,您應該尊重用戶的意圖並使用管理令牌。

  • 然後可以使用CreateProcessAsUser或CreateProcessWithTokenW從系統服務啓動新的進程。

  • 最後,服務應該刪除自己並停止。

有至少一個邊緣的情況下:如果你的升高的過程從其使用運行方式和非管理憑證推出命令窗口(或其它進程)啓動。在這種情況下沒有拆分標記,並且原始標記可能已被刪除,因此除非在提升之前捕獲副本(Larry的解決方案或其變體),否則沒有通用的方法來運行子進程高級進程最初從其啓動的用戶上下文。您所能做的最好的是登錄用戶的上下文(通過上述的WTSQueryUserToken),這可能不是最終用戶期望的行爲。 (這個可能,但是,是可以接受的限制,根據該方案。)

1

我已經成功使用的技術是使用IShellDispatch2 :: ShellExecute的要求Explorer運行過程。由於瀏覽器通常以正常完整性運行,因此這是有效的。訣竅是獲取IShellDispatch2對象是一項工作。我遵循了this blog中列出的流程。