[英]What are the UAC implementation best practices? (.NET)
我正在考慮開發一個應該在大多數時間以標准用戶身份運行的應用程序,但對於某些操作,將需要提升管理訪問權限。 在將某些內容復制到受保護的文件夾時,用戶的特性應該與Windows資源管理器中的一樣。
現在問題是,如何在.NET中實現它? 我知道只有整個進程或某些COM實例可以升級,而不是單個函數。 但這正是我所需要的。 我應該走哪條路? 寫兩個可執行文件,一個帶清單,另一個沒有; 以編程方式運行第二次提升的相同進程; 使用一些COM的東西? 然后我有添加的權限,但如何告訴其他進程該怎么辦? 使用.NET遠程處理(已棄用/復雜?); 使用套接字/管道/什么來實現我自己的IPC事物? 升級的任務可能需要在過程中間詢問用戶某些事情。 它必須是可以取消的。
有很多東西告訴我UAC如何在內部工作或系統管理員如何配置它,但我沒有找到任何可以解答這些基本問題的東西。
我們這里似乎有2個不同的問題:
這是我試圖回答它們:
我首先將每個需要提升權限的操作拆分為他們自己的“幫助程序”。 這些幫助程序只執行一個操作,通過命令行獲取參數。
例如,假設您的程序需要停止/啟動服務,我會編寫一個名為servicecontroller的小幫助程序(實際上您可能想要使用net命令),它接受類似於此的命令行參數:
servicecontroller stop MyCoolService
servicecontroller start MyCoolService
這些參數將由'Main'程序構建,並在點擊'OK'后傳遞。
上面的解決方案有幾個問題,您可能會或可能不會關心:
更多的谷歌搜索透露了這個博客文章'DevZest' ,基本上推薦了我上面所描述的。 祝好運!
編輯根據評論中提出的其他問題:
我不知道你在這里做了什么,我的看法是:
在文件管理器示例中,我將執行資源管理器的操作,並首先在每個目標目錄中進行旋轉,以確定是否有任何目標位置需要提升權限才能復制到。 如果他們這樣做,我會標記一個標志,表明該操作需要以管理員身份執行,提示用戶,然后以管理員身份執行整個操作。
至於文本編輯器示例,我會做類似上面的事情,當用戶給你一個目的地目錄檢查,看看你有對該位置的寫入權限,如果沒有通知用戶他們正在保存到需要提升的位置,將他們的工作保存到可寫位置(您的程序的APPDATA可能是一個好地方甚至是TEMP ),然后觸發請求提升的復制過程,如果用戶取消UAC對話框,請確保捕獲此取消並刪除臨時文件。
如果你發現你的程序需要在程序生命周期內請求提升超過幾次(Readas:1或2個極端情況),我會阻止你保持高級工作程序,那么我會質疑為什么它不是標記為始終提升。 我喜歡遵循“最少驚喜”的規則,當我給你提升權利時,我希望你只執行請求它的動作,而不是繼續在第一個請求中抽取需要提升的動作。
所有這一切都說沒有什么可以阻止你做上述事情,一旦你讓一些過程得到提升的權利,他可以邀請他所有的朋友。 基於您希望保持升級過程的原因,為什么不僅僅保存程序的當前狀態,並使用提升的權限重新啟動程序並恢復狀態? 在我看來,這與將工作流程存在於始終處於高位狀態的情況相同。
如果您可以告訴我們更多關於您正在嘗試做什么的信息,我們可以找到更好的方法來實現這一目標,而不必遇到UAC問題。 雖然寫入受UAC保護的區域有一些很好的理由,但在大多數情況下,程序不需要寫入/訪問這些位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.