C#程序以管理员权限运行
在Vista 和 Windows 7 及更新版本的操做系统,增长了 UAC(用户帐户控制) 的安全机制,若是 UAC 被打开,用户即便以管理员权限登陆,其应用程序默认状况下也没法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操做。这个机制大大加强了系统的安全性,但对应用程序开发者来讲,咱们不能强迫用户去关闭UAC,但有时咱们开发的应用程序又须要以 Administrator 的方式运行,如何实现这样的功能呢?windows
下面演示 C# 程序如何实现提示用户以管理员权限运行。安全
本例以WinForm程序演示,新建一项目生成后进行相应修改:app
方法一:经过 System.Diagnostics.Process.Start() 方式启动:dom
实现方法: 修改默认生成的Program文件,修改后的代码以下:ide
因为已经在代码上作了注释,因此再也不详细说明;post
1 static class Program 2 { 3 [STAThread] 4 static void Main() 5 { 6 Application.EnableVisualStyles(); 7 Application.SetCompatibleTextRenderingDefault(false); 8 9 /** 10 * 当前用户是管理员的时候,直接启动应用程序 11 * 若是不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行 12 */ 13 //得到当前登陆的Windows用户标示 14 System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); 15 System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); 16 //判断当前登陆用户是否为管理员 17 if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) 18 { 19 //若是是管理员,则直接运行 20 Application.Run(new Form1()); 21 } 22 else 23 { 24 //建立启动对象 25 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 26 startInfo.UseShellExecute = true; 27 startInfo.WorkingDirectory = Environment.CurrentDirectory; 28 startInfo.FileName = Application.ExecutablePath; 29 //设置启动动做,确保以管理员身份运行 30 startInfo.Verb = "runas"; 31 try 32 { 33 System.Diagnostics.Process.Start(startInfo); 34 } 35 catch 36 { 37 return; 38 } 39 //退出 40 Application.Exit(); 41 } 42 } 43 }
效果:因为是经过System.Diagnostics.Process.Start() 方式外部调用启动,因此直接经过VS运行时,是不会提示VS也须要管理员权限,只有程序自己须要管理员权限,与生成应用程序的程序不一样。这点是和方法二实现的主要不一样之处。ui
本文地址:http://www.cnblogs.com/Interkey/p/RunAsAdmin.htmlthis
方法二:经过添加应用程序清单文件:spa
在 项目 上 添加新项 选择“应用程序清单文件” 而后单击 添加 按钮
添加后,默认打开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