來源:https://mp.weixin.qq.com/s/ydBWABy7kwOWxNCQu4qYMA 在visual studio開發winform程式,生成msi安裝包以後,代碼運行似乎沒有問題。但是,若是軟體安裝到了C盤,軟體在執行某些操作,比如寫文件、讀文件等操作時,有可能會因為操作系統用 ...
來源:https://mp.weixin.qq.com/s/ydBWABy7kwOWxNCQu4qYMA
在visual studio開發winform程式,生成msi安裝包以後,代碼運行似乎沒有問題。但是,若是軟體安裝到了C盤,軟體在執行某些操作,比如寫文件、讀文件等操作時,有可能會因為操作系統用戶許可權不足導致讀寫不成功。關鍵這時候軟體還不報錯,可能很難發現原因。
這個問題,作為普通用戶,可以考慮滑鼠右鍵軟體選擇“以管理員許可權運行”,就可以臨時解決這個問題了。但是這個辦法怎麼看都挺不合適,為難用戶了。
查了一下資料,於是就有了下麵的解決辦法記錄。
方法一、採用Process.Start方法
思路很簡單,就是在Program.cs入口處判斷當前是不是管理員許可權,如果是,則不做其他處理,如果不是,改成管理員許可權。具體代碼如下。修改Main方法:
1 /// <summary> 2 /// 應用程式的主入口點。 3 /// </summary> 4 [STAThread] 5 static void Main() 6 { 7 Application.EnableVisualStyles(); 8 Application.SetCompatibleTextRenderingDefault(false); 9 10 //獲得當前登錄的Windows用戶標示 11 WindowsIdentity identity = WindowsIdentity.GetCurrent(); 12 WindowsPrincipal principal = new WindowsPrincipal(identity); 13 //判斷當前登錄用戶是否為管理員 14 if (principal.IsInRole(WindowsBuiltInRole.Administrator)) 15 { 16 //如果是管理員,則直接運行 17 Application.Run(new FrmMain()); 18 } 19 else 20 { 21 //創建啟動對象 22 ProcessStartInfo startInfo = new ProcessStartInfo(); 23 startInfo.UseShellExecute = true; 24 startInfo.WorkingDirectory = Environment.CurrentDirectory; 25 startInfo.FileName = Application.ExecutablePath; 26 //設置啟動動作,確保以管理員身份運行 27 startInfo.Verb = "runas"; 28 try 29 { 30 Process.Start(startInfo); 31 } 32 catch 33 { 34 return; 35 } 36 //退出 37 Application.Exit(); 38 } 39 }
方法二、直接修改exe屬性
這個方法,其實還是讓用戶來操作,只是避免了每次啟動軟體都要做而已。具體操作:右擊exe程式文件,在彈出的屬性對話框中,相容性選項中,勾選“以管理員身份運行此程式”即可。
方法三、添加應用程式清單文件
這種方法比較簡單。在vs的解決方案資源管理器點擊項目,右擊添加,新建項,選擇應用程式清單列表。
添加完成後,打開app.manifest文件,將:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
修改為:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
於是,在生成安裝包以後,正常安裝使用軟體,軟體也可以用管理員許可權讀寫文件了。