1. 程式人生 > >C#程序以管理員權限運行

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

有時 visual execution tdi efault ces environ win proc

在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#程序以管理員權限運行