使用不同的使用者憑據啟動另一個具有提升的程序
我正在嘗試從非提升程序啟動提升程序,但我還需要為具有管理憑據的使用者提供使用者名和密碼。我已經嘗試了
"runas"提升方法和使用清單,但都產生了不同的錯誤。例如,如果我這樣做(不使用需要提升的清單):
ProcessStartInfo info = new ProcessStartInfo(path); info.UseShellExecute = false; info.UserName = username; info.Password = securePwd; info.Domain = "MyDomain"; info.Verb = "runas"; var proc = Process.Start(info);該過程在不顯示 UAC 確認對話框的情況下啟動,並且在嘗試執行需要管理員權限的命令時失敗(我只是嘗試將測試文件寫入 Program Files 目錄)。
如果我向目標應用程序添加一個表明它需要提升的清單,那麼我會得到一個
Win32Exception說明該操作需要提升的說明。問題似乎設置
UseShellExecute為false(因為兩種方法都可以正常工作,但情況並非如此),但我必須將其設置為 false 才能在不同的使用者帳戶下啟動程序。如何從非提升程序啟動提升程序並手動提供使用者名和密碼?
**賞金編輯:**雖然不能要求使用者輸入管理員憑據,但 UAC 嘮叨對話框是完全可以接受的。我不想在這裡繞過 UAC。
我很驚訝沒有辦法做到這一點,直到我發現 Chris Jackson 的部落格條目:
為什麼我在使用 CreateProcessWithLogonW 時無法提升我的應用程序以管理員身份執行?
你需要一個引導程序。一些可以讓您轉換到備用使用者的程序,該使用者可能負責執行 requireAdministrator 應用程序。所以,你可以設計這樣的東西:
為什麼我們不直接創建
ShellExecuteWithLogonWAPI?我永遠不會說永遠,我們可能會在某個時候。但是今天,這個 API 的案例已經成為一種替代設計更優越的案例。最常見的要求是編寫本土軟體部署軟體的人,他們希望將憑據直接編碼到應用程序中並提升自己的流程。這裡真正的問題不是缺少 API,而是您的應用程序中編碼了管理員憑據以供全世界閱讀。
所以解決方案需要
ShellExecute,它是唯一知道如何觸發同意對話框的解決方案。它提出了一個很好的觀點:你已經用一個人的密碼做什麼了?
聊天獎金
Server Core 上沒有 UAC,因為沒有顯示同意提示的視窗。
