前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)

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

作者头像
walterlv
发布2023-10-22 09:44:47
5.3K0
发布2023-10-22 09:44:47
举报
文章被收录于专栏:walterlv - 吕毅的博客

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

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

runas 命令

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

runas RUNAS 用法: RUNAS [ /noprofile | /profile /savecred | /netonly ] /user:<UserName> program RUNAS [ /noprofile | /profile /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 不兼容。

提权运行或者降权运行

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

本质上是这段代码:

1 2 3 4 5 6

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

此代码如果在 .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");

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

参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/start-process-in-a-specific-trust-level.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • runas 命令
  • 提权运行或者降权运行
  • 提权运行或者降权运行
  • 使用 C# 代码来降权运行
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档