WPF的程序,在發布時采用的Clickonce方式發布,Win7的用戶安裝完成之后,發現執行某些操作的時候會導致程序異常。在排查后發現,是權限問題導致。如圖:
是執行File.Move時引發的異常:對路徑的訪問被拒絕。
首先想到的是:右鍵-->以管理員身份運行,但是Clickonce發布過的程序,右鍵菜單中是沒有這個選項的。
那怎么才能以管理員身份運行呢?
按照搜索的答案,
1)右鍵項目屬性
2)選擇安全性,勾選“啟用ClickOnce安全設置”
3)在項目的Properties文件夾中,找到app.mainfest
4)將節點
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
改為
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
5)回到項目屬性中的安全性選項,去掉“啟用ClickOnce安全設置”。
6)保存,編譯
一直到現在,都還是順利的,
7)發布。。。報錯!
錯誤 6 ClickOnce does not support the request execution level 'requireAdministrator'.
這是什么狗屁錯?繼續搜索,搜索的結果都是說要在項目屬性頁面中,安全性選項卡中的“啟用ClickOnce安全設置”去掉勾選。
那就去掉勾選,然后重新發布,仍舊報錯,回到安全性選項卡中發現,“啟用ClickOnce安全設置”又被勾選上了。
奇怪了。。。。。
網上搜索了N久,終於找到了解決辦法
為了使得發布之后的程序能夠獲得管理員的權限
1)app.mainfest文件中
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
節點的值設置為 asInvoker
2)在App.cs中增加以下代碼:
/// <summary> /// 檢查是否是管理員身份 /// </summary> private void CheckAdministrator() { var wi = WindowsIdentity.GetCurrent(); var wp = new WindowsPrincipal(wi); bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator); if (!runAsAdmin) { // It is not possible to launch a ClickOnce app as administrator directly, // so instead we launch the app as administrator in a new process. var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase); // The following properties run the new process as administrator processInfo.UseShellExecute = true; processInfo.Verb = "runas"; // Start the new process try { Process.Start(processInfo); } catch (Exception ex) { ex.WriteLog(); } // Shut down the current process Environment.Exit(0); } }
3)重寫 OnStartup 函數
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); CheckAdministrator(); //如果不是管理員,程序會直接退出,並使用管理員身份重新運行。 StartupUri = new Uri("MainWindow.xaml", UriKind.RelativeOrAbsolute); }
4)保存,重新生成,發布
加入上面的代碼之后,重新使用ClickOnce方式發布,安裝。在運行的時候,會彈出“您想允許來自未知發布者的以下程序對此計算機進行更改嗎”的對話框,點擊“是” 程序就會以管理員身份運行了。
參考鏈接:http://www.codeproject.com/Tips/627850/ClickOnce-deployment-vs-requestedExecutionLevel-eq