当前位置: 首页 > news >正文

Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)

在默认情况下,Windows 系统中启动一个进程会继承父进程的令牌。如果父进程是管理员权限,那么子进程就是管理员权限;如果父进程是标准用户权限,那么子进程也是标准用户权限。

我们也知道,可以使用一些方法为自己的应用程序提权。但是有没有方法可以任意指定一个权限然后运行呢?本文将介绍 Windows 下指定权限运行的做法。


本文内容

    • runas 命令
    • 提权运行或者降权运行
    • 提权运行或者降权运行
    • 使用 C# 代码来降权运行

runas 命令

runas 是 Windows 系统上自带的一个命令,通过此命令可以以指定权限级别间接启动我们的程序,而不止是继承父进程的权限。

打开 cmd 或者 PowerShell,输入 runas 命令可以看到其用法。

> runas
RUNAS 用法:

RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]
        /user:<UserName> program

RUNAS [ [/noprofile | /profile] [/env] [/savecred] ]
        /smartcard [/user:<UserName>] program

RUNAS /trustlevel:<TrustLevel> program

   /noprofile        指定不应该加载用户的配置文件。
                     这会加速应用程序加载,但
                     可能会造成一些应用程序运行不正常。
   /profile          指定应该加载用户的配置文件。
                     这是默认值。
   /env              要使用当前环境,而不是用户的环境。
   /netonly          只在指定的凭据限于远程访问的情况下才使用。
   /savecred         用用户以前保存的凭据。
   /smartcard        如果凭据是智能卡提供的,则使用这个选项。
   /user             <UserName> 应使用 USER@DOMAIN 或 DOMAIN\USER 形式
   /showtrustlevels  显示可以用作 /trustlevel 的参数的
                     信任级别。
   /trustlevel       <Level> 应该是在 /showtrustlevels 中枚举
                     的一个级别。
   program           EXE 的命令行。请参阅下面的例子

示例:
> runas /noprofile /user:mymachine\administrator cmd
> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
> runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""

注意:  只在得到提示时才输入用户的密码。
注意:  /profile 跟 /netonly 不兼容。
注意:  /savecred 跟 /smartcard 不兼容。

提权运行或者降权运行

为了演示提权或者降权,我们需要有一个能够验证当前是否是管理员权限运行的程序。关于如何在程序中判断当前是否以管理员权限运行,可以阅读我和林德熙的博客:

  • dotnet 判断程序当前使用管理员运行降低权使用普通权限运行 - 林德熙
  • 在 Windows 系统上降低 UAC 权限运行程序(从管理员权限降权到普通用户权限) - 吕毅

本质上是这段代码:

var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
if (principal.IsInRole(WindowsBuiltInRole.Administrator))
{
    // 检测到当前进程是以管理员权限运行的。
}

此代码如果在 .NET Core 中编写,以上代码需要额外安装 Windows 兼容包:Microsoft.Windows.Compatibility。

提权运行或者降权运行

我以标准用户权限和管理员权限分别启动了一个 PowerShell Core,然后准备在这两个窗口里面分别启动我的检测管理员权限的程序。

在两个 PowerShell 中运行命令

0x20000 是标准用户权限,现在运行命令:

> runas /trustlevel:0x20000 .\Walterlv.Demo.exe

运行结束后,两个进程都是非管理员权限

运行发现,两个进程现在都是标准用户权限。即使是管理员的 PowerShell 中运行的也都是非管理员权限。

0x40000 是管理员权限,现在运行命令:

> runas /trustlevel:0x40000 .\Walterlv.Demo.exe

运行结束后,两个进程都取得不高于当前 PowerShell 的最高权限

运行发现,非管理员的 PowerShell 启动的是非管理员权限的进程;而管理员的 PowerShell 启动的是管理员权限的进程。

使用 C# 代码来降权运行

使用 C# 代码,就是要将下面这一句翻译成 C#。

> runas /trustlevel:0x20000 .\Walterlv.Demo.exe

所以其实非常简单,就是 Process.Start 传入参数即可。

Process.Start("runas.exe", $"/trustlevel:0x20000 Walterlv.Demo.exe");

关于更多降权运行的方法,可以参考我的另一篇博客:

  • 在 Windows 系统上降低 UAC 权限运行程序(从管理员权限降权到普通用户权限) - 吕毅

参考资料

  • windows - How to run a process as non-admin from an elevated PowerShell console? - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • Windows 的 UAC 设置中的通知等级实际上只有两个档而已
  • Windows 系统上使用任务管理器查看进程的各项属性(命令行、DPI、管理员权限等)
  • C#/.NET 如何获取一个异常(Exception)的关键特征,用来判断两个异常是否表示同一个异常
  • C#/.NET 如何在第一次机会异常 FirstChanceException 中获取比较完整的异常堆栈
  • C#/.NET 使用 git 命令行来操作 git 仓库
  • C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?
  • WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因
  • 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)
  • 如何在 MSBuild 的项目文件 csproj 中获取绝对路径
  • C# 跨设备前后端开发探索
  • MSBuild 如何编写带条件的属性、集合和任务 Condition?
  • WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
  • 如何快速自定义 Visual Studio 中部分功能的快捷键
  • C# 8.0 如何在项目中开启可空引用类型的支持
  • C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
  • python3.6+scrapy+mysql 爬虫实战
  • Angular2开发踩坑系列-生产环境编译
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript 基本功--面试宝典
  • Java到底能干嘛?
  • vue学习系列(二)vue-cli
  • 分享一份非常强势的Android面试题
  • 人脸识别最新开发经验demo
  • 如何合理的规划jvm性能调优
  • 什么是Javascript函数节流?
  • 用Python写一份独特的元宵节祝福
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (转)编辑寄语:因为爱心,所以美丽
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • **CI中自动类加载的用法总结
  • .gitignore文件设置了忽略但不生效
  • .net 发送邮件
  • .net和php怎么连接,php和apache之间如何连接
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [Android]使用Retrofit进行网络请求
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [Codeforces] number theory (R1600) Part.11
  • [Django开源学习 1]django-vue-admin
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)
  • [JDBC-1] JDBC Base Template
  • [MTK]安卓8 ADB执行ota升级
  • [NOI2022] 众数 题解
  • [python] 过年燃放烟花
  • [SAP ABAP开发技术总结]面向对象OO
  • [Swift] Enum 好用, Enum 可以更易用