2013-08-01 38 views
2

我的應用程序通常由用戶A作爲用戶B啓動,使用System.Process.Start("app.exe", "UserB", "secret")在模擬後回退到子進程的默認用戶

現在,我想app.exe產生額外的子進程,但作爲用戶A,沒有額外的特權UserB。

有沒有辦法做到這一點,而不是問用戶A的密碼?

我試着用沒有憑證的System.Process.Start,以及調用cmd /C child.exe,但兩種方法都以UserB啓動child.exe。我正在考慮一種方法來要求當前的shell爲我啓動子進程,但我還沒有發現任何東西。

+0

我不認爲你可以,(如果用戶A是具有額外特權的用戶,這可能是相當危險的) –

+0

好點。有鑑於此,我懷疑你是對的。也許'app.exe'可以被授予適當的權限。我控制在那裏的開始,所以我可以設置這些。如果它們存在。 =) – Jens

+0

如果你控制的是啓動,不能在'appX'(啓動的那個)和'app.exe'之間安排某種反向通道,這樣後者可以請求前者作爲用戶A運行)啓動新的進程? –

回答

1

最簡單的解決方案是啓動應用程序可以製作自己的安全令牌的副本,並允許子進程繼承它的句柄。句柄值可以通過命令行或通過環境變量傳遞。

請注意,這有效地使用戶B無限制地訪問用戶A的帳戶。

+0

有趣的想法,謝謝!我不確定如何將句柄傳遞給子進程,你有提示嗎?簡單地以某種形式傳遞WindowsIdentity.Token將不起作用(正如我所知的那樣),因爲它只是一個指針,子進程將擁有自己的地址空間,並且無法使用它來訪問令牌的內存位置。或者我在這裏有什麼問題? =) – Jens

+0

.NET似乎沒有內置的支持,所以你必須通過P/Invoke使用原生函數。請參閱'DuplicateTokenEx'和'SetHandleInformation'。我在'System.Diagnostics.Process'中沒有看到顯式控制句柄繼承的選項,但它確實支持重定向輸入和輸出,這需要啓用繼承,所以我猜它是默認啓用的,或者只有當你重定向時輸入或輸出。我假設你可以使用'SafeHandle.SetHandle'將導入的句柄帶入.NET世界。 –

+0

或者,您可以通過P/Invoke啓動所有子進程,也可以使用本機DLL和本機可執行包裝來執行該部分任務。 –

相關問題