2011-05-10 92 views
13

我正在考慮開發一個應該在大多數時間以標準用戶身份運行的應用程序,但是對於某些操作,需要提升管理訪問權限。將某些內容複製到受保護的文件夾時,用戶的期望應該與Windows資源管理器中的相似。什麼是UAC實施最佳實踐? (.NET)

現在的問題是,這應該如何在.NET中實現?我知道只有整個進程或者一些COM實例可以被升級,而不是單個函數。但那正是我需要的。我應該走什麼路?寫兩個可執行文件,一個帶有清單,另一個不帶;以編程方式運行第二次提升的相同進程;使用一些COM的東西?然後我有增加的權限,但是如何告訴其他進程該怎麼做?使用.NET遠程處理(已棄用/複雜?);使用套接字/管道/任何東西來實現我自己的IPC事物?該提升的任務可能需要在該過程中詢問用戶。它必須是可以取消的。

有很多內容告訴我UAC如何在內部工作或者系統管理員如何配置它,但是我還沒有找到任何答案來回答這些基本問題。

+0

好問題,沒有答案... – 2011-05-10 09:19:02

回答

3

我們似乎這裏有兩個不同的問題:

  1. 我應該如何處理需要提升權限的操作?
  2. 如果我使用一個單獨的過程,我應該如何告訴其他過程該怎麼做?

這裏是我試圖回答他們:

  1. 看來,從這個SO問題:Windows 7 and Vista UAC - Programmatically requesting elevation in C#該解決方案是,你在你的問題建議(運行另一個進程,並讓它在起步請求海拔)是「正確的答案」
  2. 至於告訴其他進程做什麼,在這裏我將如何採取刺傷它:

我會通過拆分出來的每個動作的開始這需要提升特權給他們自己的「幫手」計劃。這些幫助程序只執行一個動作,通過命令行參數。例如,假設你的程序需要停止/啓動一個服務,我會寫一個名爲servicecontroller的小型助手程序(實際上你可能想使用net命令),這個命令行參數類似於這個:

servicecontroller stop MyCoolService 
servicecontroller start MyCoolService 

這些參數將由'Main'程序構建,並在點擊'OK'後傳遞。

有上面雖然解決的幾個問題,你可能會或可能不會在意:

  1. 你傳遞參數的命令行,可以很容易地嗅探
  2. 你被限制在ProcessStartInfo.Argument +程序路徑的長度(來自MSDN:)添加到進程完整路徑長度的參數長度必須小於2080。
  3. 快速傳回給你的信息可能是一個有點棘手(如果你需要這個)

多一點谷歌上搜索發現通過'DevZest'這篇博客基本上建議我所如上所述。祝你好運!


編輯根據在評論中問其他問題:

  1. ,你會推薦啓動一個單獨的可執行文件或需要執行的操作升高時相同的可執行文件?
  2. (我的字裏行間就這一個)我應該多久提示這些操作的用戶?

沒有確切知道你在做什麼,這裏是我對此採取:

  1. 我個人有不同的可執行文件爲每個動作,但不知道你想要做什麼它很難打出這個電話。一般來說,雖然看起來你想要爲每個高架行動分開一個過程。
  2. 我有點被你的第二個例子迷惑,再次不知道你正在試圖做的,我會根據你關在您的評論給了例子只是去什麼。

在文件管理器示例中,我將執行explorer的操作,並首先旋轉每個目標目錄以確定是否有任何目標位置需要提升特權才能複製到目標位置。如果他們這樣做,我會標記一個標誌,指示該操作需要以管理員身份執行,提示用戶,然後以管理員身份執行整個操作。

至於文本編輯器的例子,我會做如上,類似的,當用戶給你一個目標目錄檢查,看看你有到該位置的寫入權限,如果沒有告知,他們將文件保存到用戶需要提升的位置,將他們的工作保存到可寫位置(程序的APPDATA可能是一個好地方,或者甚至是TEMP),然後觸發請求提升的複製過程,如果用戶取消UAC對話框,請確保你捕獲這個取消並刪除臨時文件。

如果您發現您的程序在程序使用壽命期間需要提升幾次以上(Readas:1或2個角落案例),我會阻止您保持較高的工作流程,那麼我會質疑爲什麼它沒有被標記爲總是提升。我喜歡跟着「最驚喜」的規則,當我給你提升的權利我希望你只執行請求它,不要再繼續泵需要通過第一個請求海拔動作的動作。

之所以這麼說的沒有什麼阻止你做上面的,一旦你讓一些工藝得到提升的權限,他可以在他的所有好友的邀請。根據你的願望,保持周圍升高的過程中爲什麼不保存程序的當前狀態,並使用提升的權限重新啓動該程序並恢復狀態?在我看來,這與工作人員進程始終處於高級狀態的情況相同。

如果你能告訴我們更多關於你想該怎麼做,我們也許能找到更好的方法來實現這個目標,而不必運行到UAC的問題。雖然有很多理由寫入受UAC保護的區域,但在大多數情況下,程序不需要寫入/訪問這些位置。

+1

爲了讓參數來回傳遞,你也可以使用環境變量和控制檯輸出。如果你創建一個進程啓動信息,你可以爲這個進程專門設置環境變量,開始後你可以讀取標準輸出。 – Zebi 2011-05-10 20:44:40

+0

嗯,更多的問題與答案我想...第一部分:你會建議開始一個單獨的可執行文件或相同的可執行文件與不同的參數?我會部署1個或2個.exe文件嗎?第二:我可能需要與升級過程進行很多互動。只是告訴它如何處理簡單的cmdline參數可能是不夠的。我需要狀態或數據返回值。想想文件管理器/文本編輯器:我正在複製文件,然後突然確定我需要更多權限。另一個過程需要無縫地繼續複製工作。或者 - > – ygoe 2011-05-11 07:56:23

+0

< - 需要將文件保存到受保護位置的文本編輯器。它必須通過文件數據寫入,這可能是一些兆字節或更多的數據。我希望將這個過程保持一段時間,這樣我就可以告訴它其他事情,而不是一次又一次地爲用戶執行每一個動作。此外,所有這些操作可能需要也可能不需要提升,具體取決於他們的工作內容。我想我會將這些函數外包給一個通用的DLL,並在兩個可執行文件中使用它們。 – ygoe 2011-05-11 07:58:30