了解C#程序以管理员权限运行的实现
|
admin
2024年10月20日 23:16
本文热度 1993
|
前言
自 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 编辑过