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