本文转载:http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢?
下面演示 C# 程序如何实现提示用户以管理员权限运行。
本例以WinForm程序演示,新建一项目生成后进行相应修改:
方法一:通过 System.Diagnostics.Process.Start() 方式启动:
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也需要管理员权限,只有程序本身需要管理员权限,与生成应用程序的程序不同。这点是和方法二实现的主要不同之处。
方法二:通过添加应用程序清单文件:
在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮
添加后,默认打开app.manifest文件,将:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
修改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。
重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。
需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。
方法三:直接修改程序文件的属性
右击程序文件,在弹出的属性对话框中的 兼容性 标签页中
勾选“以管理员身份运行此程序”即可。