在 Windows 系统中,管理员权限和非管理员权限运行的程序之间不能使用 Windows 提供的通信机制进行通信。对于部分文件夹(ProgramData),管理员权限创建的文件是不能以非管理员权限修改和删除的。
然而,一个进程运行之后启动的子进程,会继承当前进程的 UAC 权限;于是有时我们会有降权运行的需要。本文将介绍 Windows 系统上降权运行的几种方法。
本文的降权运行指的是:
- 有一个 A 程序是以管理员权限运行的(典型的,如安装包);
- 有一个 B 程序会被 A 启动(我们期望降权运行的 B 程序)。
本文内容
如何判断当前进程的 UAC 权限
通过下面的代码,可以获得当前进程的 UAC 权限。
var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
而如果要判断是否是管理员权限,则使用:
if (principal.IsInRole(WindowsBuiltInRole.Administrator))
{
// 当前正在以管理员权限运行。
}
此代码如果在 .NET Core 中编写,需要额外安装 Windows 兼容包:Microsoft.Windows.Compatibility。+
方法一:使用 runas 命令来运行程序(推荐)
使用 runas
命令来运行,可以指定一个权限级别:
> runas