2013-12-13 24 views
1

我們有一個附帶清單的程序和選項「level =」requireAdministrator「 在標準用戶(不是管理員)下啓動程序後,它升級到管理員用戶,從那時起SHGetFolderPath(0,CSIDL_LOCAL_APPDATA ,0,SHGFP_TYPE_CURRENT,@ buf))返回管理本地目錄,但不是用戶的最初啓動的地方 當然,我們可以將標準用戶令牌作爲第三個參數傳遞給SHGetFolderPath,但我們如何才能在高級程序中獲得它?有沒有這樣做的方式?如何獲取原始用戶令牌? UAC,清單,安裝程序

當然,因爲這個問題我們有另一個問題。如何啓動另一個程序與ShellExecute不是在高級程序中的管理?當然,我們可以使用CreateProcessWithToke但是仍然存在令牌存在的問題(如何獲取此令牌)。 現在我們正在尋找IShellDispatch2接口,並嘗試啓動應用程序而不是以管理員身份使用瀏覽器,但有些東西告訴我這是錯誤的方式。

我知道我們必須以標準用戶身份啓動程序,然後使用com對象只提升應該使用管理權限執行的部分代碼。但是,主要問題仍然是令牌。

也有一個想法,就是要證明與「級別=」 asInvoker」,並開始第一程序作爲標準用戶,檢測到所有的本地用戶的路徑,並把它作爲參數與runas方式,SEE_MASK_NOCLOSEPROCESS選項給ShellExecuteEx並運行相同的程序,但作爲管理後,提高程序將退出,我們可以不升高程序不能執行任何程序作爲管理員這是正確的方式

回答

1

也許有點晚了,但你的另一種選擇是正確的選擇。一旦程序升級,沒有可靠的方式啓動另一個程序,但沒有提升,甚至不知道用戶是否啓動了它,如果它是用不同的憑證完成的。

所有這些問題的一般解決方案是將程序分成兩個不同的進程(可以在1個或2個不同的EXE中實現,只要你喜歡)。用戶運行的「主」程序運行,沒有的海拔高度,表現爲asInvoker,反過來啓動第二個「工人」過程,表現爲requireAdministrator。主工程師可以通過命令行,未命名管道,窗口消息或任何其他形式的IPC將原始用戶的數據傳遞給第二個工作人員,而工作進程執行所有管理員工作。可能你可能想要通知主流程何時該產生另一個非升級的程序。

1

從雷蒙德陳:?

How can I launch an unelevated process from my elevated process and vice versa?

從未經升高的過程轉向高架過程很容易。您可以使用提升的passing the runas verb向ShellExecute或ShellExecuteEx運行進程。

另一種方式更棘手。一方面,要讓你的標記正確移除標高屬性真的很難。另一方面,即使你能做到,也不是正確的做法,因爲未升級的用戶可能與升級的用戶不同。

這裏的解決方案是回到資源管理器並要求資源管理器爲您啓動程序。由於資源管理器以原始未升級的用戶身份運行,因此該程序將以原始未升級的用戶身份運行。

我試圖將代碼從C++轉換出來,但它太多了,無法管理。

簡短的版本是:這是非常困難的。

相關問題