C#程序以管理員權限運行(ZT)

      本文轉載:http://www.cnblogs.com/Interkey/p/RunAsAdmin.htmlhtml

       在Vista 和 Windows 7 及更新版本的操做系統,增長了 UAC(用戶帳戶控制) 的安全機制,若是 UAC 被打開,用戶即便以管理員權限登陸,其應用程序默認狀況下也沒法對系統目錄、系統註冊表等可能影響系統正常運行的設置進行寫操做。這個機制大大加強了系統的安全性,但對應用程序開發者來講,咱們不能強迫用戶去關閉UAC,但有時咱們開發的應用程序又須要以 Administrator 的方式運行,如何實現這樣的功能呢?安全

   

     下面演示 C# 程序如何實現提示用戶以管理員權限運行。app

     本例以WinForm程序演示,新建一項目生成後進行相應修改:ide

方法一:經過 System.Diagnostics.Process.Start() 方式啓動:ui

    

 1 static class Program
 2     {
 3         /// <summary>
 4         /// 應用程序的主入口點。
 5         /// </summary>
 6         [STAThread]
 7         static void Main(string[] Args)
 8         {
 9             Application.EnableVisualStyles();
10             Application.SetCompatibleTextRenderingDefault(false);
11             System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
12             System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
13             bool createNew;
14             //經過Mutex對象判斷程序是否已經啓動
15             using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
16             {
17                 if (createNew)
18                 {
19                     if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
20                     {
21                         //若是是管理員,則直接運行   
22                         //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
23                         //Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
24                         Application.Run(new MainForm());
25                     }
26                     else
27                     {
28                         //建立啓動對象   
29                         System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
30                         
31                         //設置運行文件   
32                         startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
33                         //設置啓動參數   
34                         startInfo.Arguments = String.Join(" ", Args);
35                         //設置啓動動做,確保以管理員身份運行   
36                         startInfo.Verb = "runas";
37                         //若是不是管理員,則啓動UAC   
38                         System.Diagnostics.Process.Start(startInfo);
39                         //退出   
40                         System.Windows.Forms.Application.Exit();
41                     }
42                 }
43                 else
44                 {
45                     MessageBox.Show("程序已經在運行中...", "提示", MessageBoxButtons.OK,
46                          MessageBoxIcon.Asterisk);
47                     System.Threading.Thread.Sleep(1000);
48                     System.Environment.Exit(1);
49                 }
50             }
51         }
52     }

      效果:因爲是經過System.Diagnostics.Process.Start() 方式外部調用啓動,因此直接經過VS運行時,是不會提示VS也須要管理員權限,只有程序自己須要管理員權限,與生成應用程序的程序不一樣。這點是和方法二實現的主要不一樣之處。spa

方法二:經過添加應用程序清單文件:操作系統

在 項目 上 添加新項 選擇「應用程序清單文件」 而後單擊 添加 按鈕調試

添加後,默認打開app.manifest文件,將:code

<requestedExecutionLevel  level="asInvoker" uiAccess="false" />orm

修改成:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

而後打開 項目屬性 ,將 應用程序 標籤頁中的 資源 中的 清單 修改成新建的 app.manifest。

從新生成項目,再次打開程序時就會提示 須要以管理員權限運行。

須要注意的是:若是在VS中 啓動調試 的話,就會提示 此任務要求應用程序具備提高的權限。

方法三:直接修改程序文件的屬性

右擊程序文件,在彈出的屬性對話框中的 兼容性 標籤頁中

勾選「以管理員身份運行此程序」便可。

相關文章
相關標籤/搜索