我們似乎這裏有兩個不同的問題:
- 我應該如何處理需要提升權限的操作?
- 如果我使用一個單獨的過程,我應該如何告訴其他過程該怎麼做?
這裏是我試圖回答他們:
- 看來,從這個SO問題:Windows 7 and Vista UAC - Programmatically requesting elevation in C#該解決方案是,你在你的問題建議(運行另一個進程,並讓它在起步請求海拔)是「正確的答案」
- 至於告訴其他進程做什麼,在這裏我將如何採取刺傷它:
我會通過拆分出來的每個動作的開始這需要提升特權給他們自己的「幫手」計劃。這些幫助程序只執行一個動作,通過命令行參數。例如,假設你的程序需要停止/啓動一個服務,我會寫一個名爲servicecontroller的小型助手程序(實際上你可能想使用net命令),這個命令行參數類似於這個:
servicecontroller stop MyCoolService
servicecontroller start MyCoolService
這些參數將由'Main'程序構建,並在點擊'OK'後傳遞。
有上面雖然解決的幾個問題,你可能會或可能不會在意:
- 你傳遞參數的命令行,可以很容易地嗅探
- 你被限制在ProcessStartInfo.Argument +程序路徑的長度(來自MSDN:)添加到進程完整路徑長度的參數長度必須小於2080。)
- 快速傳回給你的信息可能是一個有點棘手(如果你需要這個)
多一點谷歌上搜索發現通過'DevZest'這篇博客基本上建議我所如上所述。祝你好運!
編輯根據在評論中問其他問題:
- ,你會推薦啓動一個單獨的可執行文件或需要執行的操作升高時相同的可執行文件?
- (我的字裏行間就這一個)我應該多久提示這些操作的用戶?
沒有確切知道你在做什麼,這裏是我對此採取:
- 我個人有不同的可執行文件爲每個動作,但不知道你想要做什麼它很難打出這個電話。一般來說,雖然看起來你想要爲每個高架行動分開一個過程。
- 我有點被你的第二個例子迷惑,再次不知道你正在試圖做的,我會根據你關在您的評論給了例子只是去什麼。
在文件管理器示例中,我將執行explorer的操作,並首先旋轉每個目標目錄以確定是否有任何目標位置需要提升特權才能複製到目標位置。如果他們這樣做,我會標記一個標誌,指示該操作需要以管理員身份執行,提示用戶,然後以管理員身份執行整個操作。
至於文本編輯器的例子,我會做如上,類似的,當用戶給你一個目標目錄檢查,看看你有到該位置的寫入權限,如果沒有告知,他們將文件保存到用戶需要提升的位置,將他們的工作保存到可寫位置(程序的APPDATA可能是一個好地方,或者甚至是TEMP),然後觸發請求提升的複製過程,如果用戶取消UAC對話框,請確保你捕獲這個取消並刪除臨時文件。
如果您發現您的程序在程序使用壽命期間需要提升幾次以上(Readas:1或2個角落案例),我會阻止您保持較高的工作流程,那麼我會質疑爲什麼它沒有被標記爲總是提升。我喜歡跟着「最驚喜」的規則,當我給你提升的權利我希望你只執行請求它,不要再繼續泵需要通過第一個請求海拔動作的動作。
之所以這麼說的沒有什麼阻止你做上面的,一旦你讓一些工藝得到提升的權限,他可以在他的所有好友的邀請。根據你的願望,保持周圍升高的過程中爲什麼不保存程序的當前狀態,並使用提升的權限重新啓動該程序並恢復狀態?在我看來,這與工作人員進程始終處於高級狀態的情況相同。
如果你能告訴我們更多關於你想該怎麼做,我們也許能找到更好的方法來實現這個目標,而不必運行到UAC的問題。雖然有很多理由寫入受UAC保護的區域,但在大多數情況下,程序不需要寫入/訪問這些位置。
好問題,沒有答案... – 2011-05-10 09:19:02