WPF以Clickonce方式發布后使用管理員身份運行


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM