標籤:程式開發 方法 資源 連結 建立 static ica ide title
在Vista 和 Windows 7 及更新版本的作業系統,增加了 UAC(使用者賬戶控制) 的安全機制,如果 UAC 被開啟,使用者即使以管理員權限登入,其應用程式預設情況下也無法對系統目錄、系統註冊表等可能影響系統正常啟動並執行設定進行寫操作。這個機制大大增強了系統的安全性,但對應用程式開發人員來說,我們不能強迫使用者去關閉UAC,但有時我們開發的應用程式又需要以 Administrator 的方式運行,如何?這樣的功能呢?
下面示範 C# 程式如何?提示使用者以管理員權限運行。
本例以WinForm程式示範,建立一項目產生後進行相應修改:
方法一:通過 System.Diagnostics.Process.Start() 方式啟動:
實現方法: 修改預設產生的Program檔案,修改後的代碼如下:
由於已經在代碼上做了注釋,所以不再詳細說明;
static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); /** * 目前使用者是管理員的時候,直接啟動應用程式 * 如果不是管理員,則使用啟始物件啟動程式,以確保使用管理員身份運行 */ //獲得當前登入的Windows使用者標示 System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); //判斷當前登入使用者是否為管理員 if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) { //如果是管理員,則直接運行 Application.Run(new Form1()); } else { //建立啟始物件 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = Application.ExecutablePath; //設定啟動動作,確保以管理員身份運行 startInfo.Verb = "runas"; try { System.Diagnostics.Process.Start(startInfo); } catch { return; } //退出 Application.Exit(); } } }
效果:由於是通過System.Diagnostics.Process.Start() 方式外部調用啟動,所以直接通過VS運行時,是不會提示VS也需要管理員權限,只有程式本身需要管理員權限,與產生應用程式的程式不同。這點是和方法二實現的主要不同之處。
本文地址:http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
方法二:通過添加應用程式資訊清單檔案:
在 項目 上 添加新項 選擇“應用程式資訊清單檔案” 然後單擊 添加 按鈕
添加後,預設開啟app.manifest檔案,將:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
修改為:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
然後開啟 項目屬性 ,將 應用程式 標籤頁中的 資源 中的 清單 修改為建立的 app.manifest。
重建項目,再次開啟程式時就會提示 需要以管理員權限運行。
需要注意的是:如果在VS中 啟動調試 的話,就會提示 此任務要求應用程式具有較高的權限。如:
選擇 使用其他憑據重新啟動 即可。
方法三:直接修改程式檔案的屬性
右擊程式檔案,在彈出的屬性對話方塊中的 相容性 標籤頁中
勾選“以管理員身份運行此程式”即可。
判斷程式是否以管理員身份運行
需要添加命名空間:
using System.Security.Principal;
/// <summary> /// 確定當前主體是否屬於具有指定 Administrator 的 Windows 使用者組 /// </summary> /// <returns>如果當前主體是指定的 Administrator 使用者組的成員,則為 true;否則為 false。</returns> public static bool IsAdministrator() { bool result; try { WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); result = principal.IsInRole(WindowsBuiltInRole.Administrator); //http://www.cnblogs.com/Interkey/p/RunAsAdmin.html //AppDomain domain = Thread.GetDomain(); //domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); //WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal; //result = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); } catch { result = false; } return result; }
如果有興趣還可以繼續查看下面的連結:
http://www.cnblogs.com/Lemon_s/archive/2011/07/28/2119222.html
http://www.cnblogs.com/shenchao/archive/2013/03/05/2944660.html
希望能幫到大家~~~
C#程式以管理員權限運行