Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
在默认情况下,Windows 系统中启动一个进程会继承父进程的令牌。如果父进程是管理员权限,那么子进程就是管理员权限;如果父进程是标准用户权限,那么子进程也是标准用户权限。
我们也知道,可以使用一些方法为自己的应用程序提权。但是有没有方法可以任意指定一个权限然后运行呢?本文将介绍 Windows 下指定权限运行的做法。
runas 命令
runas 是 Windows 系统上自带的一个命令,通过此命令可以以指定权限级别间接启动我们的程序,而不止是继承父进程的权限。
打开 cmd 或者 PowerShell,输入 runas
命令可以看到其用法。
1 | > runas |
提权运行或者降权运行
为了演示提权或者降权,我们需要有一个能够验证当前是否是管理员权限运行的程序。
1 | var identity = WindowsIdentity.GetCurrent(); |
此代码如果在 .NET Core 中编写,以上代码需要额外安装 Windows 兼容包:
Microsoft.Windows.Compatibility
提权运行或者降权运行
我以标准用户权限和管理员权限分别启动了一个 PowerShell Core,然后准备在这两个窗口里面分别启动我的检测管理员权限的程序。
0x20000 是标准用户权限,现在运行命令:
1 | runas /trustlevel:0x20000 .\Walterlv.Demo.exe |
运行发现,两个进程现在都是标准用户权限。即使是管理员的 PowerShell 中运行的也都是非管理员权限。
0x40000 是管理员权限,现在运行命令:
1 | runas /trustlevel:0x40000 .\Walterlv.Demo.exe |
运行发现,非管理员的 PowerShell 启动的是非管理员权限的进程;而管理员的 PowerShell 启动的是管理员权限的进程。
使用 C# 代码来降权运行
使用 C# 代码,就是要将下面这一句翻译成 C#
1 | runas /trustlevel:0x20000 .\Walterlv.Demo.exe |
所以其实非常简单,就是 Process.Start 传入参数即可。
1 | Process.Start("runas.exe", $"/trustlevel:0x20000 Walterlv.Demo.exe"); |
参考:
windows - How to run a process as non-admin from an elevated PowerShell console? - Stack Overflow