了解C#程序以管理员权限运行的实现
				
									
					
					
						|  | 
							admin 2024年10月20日 23:16
								本文热度 2016 | 
					
				 
				前言
自 Windows Vista  开始,系统就增加了UAC(用户账户控制) 的安全机制,当 UAC 被打开,我们即使以管理员权限登录,应用程序默认情况下也无法对系统目录、系统注册表等进行操作,从而提升了系统的安全性。但对我们开发的应用程序来说,程序如何以管理员的方式运行,则需开发者考虑。本文介绍了 C# 程序如何实现用户以管理员权限运行。
实现
1、修改应程序文件的属性
在安装好的应用程序目录中,右击程序文件,选择属性,然后在弹出的属性界面中找到兼容性标签页,勾选以管理员身份运行此程序。其实这种方式并不是开发者实现的,只是用户根据指引调整实现。这为用户者带来了不少的麻烦,操作起来也不友好。
2、通过配置应用程序清单文件
在 C# 的项目上,可通过右击项目,选择添加,在新项中选择应用程序清单文件(仅限Windows) 添加文件到项目中。打开文件,找到与UAC相关设置项。
<requestedExecutionLevel  level="asInvoker" uiAccess="false" />修改为:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
修改文件后,将清单文件添加到项目的资源中,右击项目-->属性-->资源-->添加资源文件(选择app.manifest)。重新生成项目后,打开应用程序时就会提示需要以管理员权限运行。如下图:

注意:通过配置上面方式后,我们应该使用管理员身份运行 Microsoft Visual Studio。否则提示下图:

3、通过在程序入口编写代码
在应用程序入口文件 Program.cs 添加相关代码。主要使用Process.Start 方式启动应用程,使用此方式 ,运行程序时,也会提示以管理员身份运行,需要用户点击提示才以启动程序。
using Microsoft.Win32;using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Security.Principal;using System.Threading.Tasks;using System.Windows.Forms;
namespace Fountain.WinForms.UACDemo{    internal static class Program    {        internal static ApplicationContext context = null;        /// <summary>        /// 应用程序的主入口点。        /// </summary>        [STAThread]        static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            if (IsRunAsAdmin())            {                // 是管理员角色,管理员权限运行                context = new ApplicationContext(new FormMain());                Application.Run(context);            }            else            {                // 使用 ProcessStartInfo 以管理员方式启动                RunAsAdmin();                //退出                Application.Exit();            }        }        /// <summary>        /// 使用 ProcessStartInfo 以管理员方式启动        /// </summary>        public static void RunAsAdmin()        {            ProcessStartInfo startInfo = new ProcessStartInfo();            //设置以管理员方式启动标记            startInfo.Verb = "runas";            //使用shell启动进程            startInfo.UseShellExecute = true;            startInfo.FileName = Process.GetCurrentProcess().MainModule.FileName;            Process.Start(startInfo);        }        /// <summary>        /// 判断当前角色,是否为管理员权限运行        /// </summary>        /// <returns></returns>        public static bool IsRunAsAdmin()        {            // 获取当前的windows 用户            WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();            // 检查 获取当前的windows 用户 的 Windows 组成员身份。            WindowsPrincipal windows = new WindowsPrincipal(windowsIdentity);            // 判断当前用户是否是管理员            if (windows.IsInRole(WindowsBuiltInRole.Administrator))            {                return true;            }            return false;        }            }}
小结
上面三种方式,除第一种方式,不是在编写应用程序时指定以管理员权限方式启动的实现,但都能实现管理员权限运行应用程序的目的。在使用代码时,我们还可增加判断当前是否开启UAC、判断UAC管理员提升权限提示行为等来确认启动管理员权限运行的提前条件。希望这些内容对您有所帮助,如有不到之处,请多多包涵。如果你觉得还有其它例子欢迎留言。
该文章在 2024/10/22 12:10:40 编辑过