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

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

下面演示 C# 程序如何實現提示用戶以管理員權限運行。 本例以WinForm程序演示,新建一項目生成後進行相應修改: 方法一:經過 System.Diagnostics.Process.Start() 方式啓動: 實現方法: 修改默認生成的Program文件,修改後的代碼以下:windows

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也須要管理員權限,只有程序自己須要管理員權限,與生成應用程序的程序不一樣。這點是和方法二實現的主要不一樣之處。 方法二:經過添加應用程序清單文件: 在 項目 上 添加新項 選擇「應用程序清單文件」 而後單擊 添加 按鈕 添加後,默認打開app.manifest文件,將: <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 修改成: <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 而後打開 項目屬性 ,將 應用程序 標籤頁中的 資源 中的 清單 修改成新建的 app.manifest。 從新生成項目,再次打開程序時就會提示 須要以管理員權限運行。 須要注意的是:若是在VS中 啓動調試 的話,就會提示 此任務要求應用程序具備提高的權限。以下圖:安全

輸入圖片說明 選擇 使用其餘憑據從新啓動 便可。 方法三:直接修改程序文件的屬性 右擊程序文件,在彈出的屬性對話框中的 兼容性 標籤頁中 勾選「以管理員身份運行此程序」便可。app

輸入圖片說明

判斷程序是否以管理員身份運行 須要添加命名空間: using System.Security.Principal;dom

/// <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;
    }
相關文章
相關標籤/搜索