2014-09-25 52 views
2

全部。這可能看起來像一個重複的問題,在這裏有很多關於提升和降低兒童進程的問題。是否可以提升多個子進程的權限,僅提示一次?

我知道使用UseShellExecute = true連同Verb = "runas"選項以提升權限啓動子進程。

例(在許多問題的答案找到):

var info = new ProcessStartInfo(Assembly.GetEntryAssembly().Location) 
{ 
    UseShellExecute = true, // ! 
    Verb = "runas", 
}; 

我在這裏的問題是不是開始升高訪問的子進程,我想知道是否有一種方法來提示升高訪問只一次,之後幾次啓動同一個子進程,比如說其中的8個進程。

我正在使用的應用程序使用排隊系統來處理任務。根據用戶的內核數量,爲每個內核啓動子進程(QueueProcessor),然後開始處理該隊列。因此,本質上,我想檢查用戶的權限,提升權限一次,並啓動所有8個隊列處理器。

我無法使用manifest-route來要求整個應用程序在管理權限中運行,因爲這不是我們許多用戶的選項。編輯根據@ MPatel的評論:爲了澄清,我們特別不強制用戶按照設計決定以管理員身份運行應用程序。

顯然你可以看到當你每次想要運行這些任務之一時,如果你不得不點擊UAC對話8次,它會變得很煩人。

我遇到了這篇文章:Vista UAC The Definitive Guide,在我的搜索過程中,但我在C#.NET 3.5項目中實現C++ dll時遇到問題。這是基本上讓我問這是否可能的文章。

可能值得一提的另一件事:我不確定我是否稍微誤解了這個問題。用戶必須有足夠的權限才能使用我們程序使用的基本SQL功能。所以我認爲我的問題可能不是讓子進程運行完整的管理權限,而是讓子進程啓動。我得到的問題是.NET不允許某些用戶從正在運行的應用程序運行子進程。讓用戶使用「以管理員身份運行」運行主應用似乎可以解決此問題。是否有一些UAC特定的權利,我可以通過提示設置一次,以允許主App啓動child.exe?

+1

用提升的權限啓動父進程?當然,這將啓動具有相同權限的所有子進程。 – 2014-09-25 09:31:07

+0

我已經編輯了一下這個問題。我們特別不強制用戶以管理員身份運行。爲什麼我在問題中添加了最後一位,我們的用戶至少可以訪問sql服務器並執行查詢,所以這實際上是我需要的所有權利。所以我認爲我的問題可能會更強迫父應用程序能夠啓動子進程。 – DeVil 2014-09-25 09:41:29

回答

9

您可以編寫自己的進程(C#應用程序),該進程將由具有提升權限的主應用程序啓動。

比起來,無論何時您需要使用提升的權限啓動進程,您都可以通過使用某種進程間通信(NamedPipes,TcpClient等)將此請求轉發給您的提升進程,並且將像往常一樣啓動此進程,導致升高的過程,因爲它是從高架起步的。

+0

+1。這裏的問題是,對於不同價格的子樹,海拔反覆發生。這種方法確保有一個提升的子樹可用於等待命令。 – TomTom 2014-09-25 12:07:20

+2

+1,或者我們甚至可能安裝一個具有所需特權的Windows服務,讓它爲我們的任務生成子項,然後根本沒有UAC彈出窗口(服務安裝期間或手動啓動期間除外)。 – user3473830 2014-10-01 22:27:38

0

首先,微軟發佈了關於處理UAC的指導方針。顯示煩人用戶提示的背後原理是,微軟希望開發人員能夠從頭開始創建具有最小權限的應用程序。我不認爲有一些神奇的參數可以用一個用戶提示來分叉幾個提升的子進程。

與提升您的主應用程序的解決方案相比,您可以創建一個服務器/服務應用程序並將所有管理任務移入其中。該應用程序將在後臺運行而無需UI。它只會顯示一次UAC提示。您可以設置具有特定池大小的線程池來有效地處理任務。當您創建任何子進程時,子進程可以在本地和無提示運行非管理任務。要執行管理任務,它將使用任何IPC技術與服務器/服務應用程序進行通信。

我希望我的建議可以幫助你。當然,解決方案需要額外的編碼工作。如果您認爲這種方法適合您,我可以分享更多的線索。