Dot-Net

使用不同的使用者憑據啟動另一個具有提升的程序

  • March 26, 2012

我正在嘗試從非提升程序啟動提升程序,但我還需要為具有管理憑據的使用者提供使用者名和密碼。我已經嘗試了"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說明該操作需要提升的說明。

問題似乎設置UseShellExecutefalse(因為兩種方法都可以正常工作,但情況並非如此),但我必須將其設置為 false 才能在不同的使用者帳戶下啟動程序。

如何從非提升程序啟動提升程序並手動提供使用者名和密碼?

**賞金編輯:**雖然不能要求使用者輸入管理員憑據,但 UAC 嘮叨對話框是完全可以接受的。我不想在這裡繞過 UAC。

我很驚訝沒有辦法做到這一點,直到我發現 Chris Jackson 的部落格條目:

為什麼我在使用 CreateProcessWithLogonW 時無法提升我的應用程序以管理員身份執行?

你需要一個引導程序。一些可以讓您轉換到備用使用者的程序,該使用者可能負責執行 requireAdministrator 應用程序。所以,你可以設計這樣的東西:

在此處輸入圖像描述

為什麼我們不直接創建ShellExecuteWithLogonWAPI?我永遠不會說永遠,我們可能會在某個時候。但是今天,這個 API 的案例已經成為一種替代設計更優越的案例。

最常見的要求是編寫本土軟體部署軟體的人,他們希望將憑據直接編碼到應用程序中並提升自己的流程。這裡真正的問題不是缺少 API,而是您的應用程序中編碼了管理員憑據以供全世界閱讀。

所以解決方案需要 ShellExecute,它是唯一知道如何觸發同意對話框的解決方案。

它提出了一個很好的觀點:你已經用一個人的密碼做什麼了?

聊天獎金

Server Core 上沒有 UAC,因為沒有顯示同意提示的視窗。

引用自:https://stackoverflow.com/questions/9872764