如何使用命令行打开Windows的提升权限cmd?

150

如何在普通命令提示符上使用命令行打开提升的命令提示符?

例如,我使用runas /username:admin cmd,但打开的cmd似乎没有被提升权限!有什么解决办法吗?


我尝试了所有的答案。最有用的答案没有使用任何软件,且操作最少,可以在https://dev59.com/HGIk5IYBdhLWcg3wn_j1#40942828找到。 - TheGuardener
31个回答

220

我遇到了相同的问题,唯一能够从CMD中以管理员身份打开CMD的方式是执行以下步骤:

  1. 打开CMD
  2. 输入 powershell -Command "Start-Process cmd -Verb RunAs" 并按下 Enter
  3. 会出现一个弹出窗口询问是否要以管理员身份打开CMD

4
好的回答。我添加了一些修改,使它可以在一条命令行中运行! - Preet Sangha
1
我创建了一个批处理文件,并将其保存为admincmd.bat,放在我的Windows文件夹中,这样我只需要输入“admincmd”,按回车键,就可以打开管理员命令提示符。(我还在批处理文件中添加了另一行代码"exit",以便关闭非管理员命令提示符窗口) - Tony Brix
需要这个来提升以另一个用户身份运行的提示。 - T2PS
有没有办法避免以下弹出窗口?我想从非交互式脚本中生成一个提升的 cmd。 - 31 bit
1
@31bit 你是指 UAC 弹出提示框吗?我认为你需要禁用 UAC(除非有我不知道的漏洞),但出于安全性考虑,我强烈建议你保持 UAC 启用状态。 - Twisted Code
显示剩余3条评论

54

我没有足够的声望在置顶答案下添加评论,但是通过使用别名功能,您只需键入以下内容即可获得相同的效果:

powershell "start cmd -v runAs"

这只是user3018703卓越解决方案的简化版本:

powershell -Command "Start-Process cmd -Verb RunAs"

1
请注意,-v 不再是 -Verb 的快捷方式,因为 -Verb-Verbose 之间存在歧义,因此需要明确拼写 -Verb - jcaron
如果您需要向cmd传递参数,例如运行一次性任务,请将参数作为转义字符串传递: powershell "start \"cmd\" \"/C echo \\"hi && pause\\"\" -v runAs" - Rashi Abramson

50

尝试其他答案后我采用的简单方法

方法1:不使用第三方程序(我使用了该方法)

  1. 创建一个名为sudo.bat的文件(您可以将sudo替换为任何想要的名称),并添加以下内容: powershell.exe -Command "Start-Process cmd \"/k cd /d %cd%\" -Verb RunAs"
  2. sudo.bat移动到PATH中的一个文件夹中;如果您不知道这是什么意思,只需将这些文件移动到c:\windows\即可。
  3. 现在,在运行对话框(win+r)或资源管理器地址栏中键入sudo即可运行此命令(这是最好的部分 :))

方法2:使用第三方程序

  1. 下载NirCmd并解压缩它。
  2. 创建一个名为sudo.bat的文件(您可以将sudo替换为任何想要的名称),并添加以下内容: nircmdc elevate cmd /k "cd /d %cd%"
  3. nircmdc.exesudo.bat移动到PATH中的一个文件夹中;如果您不知道这是什么意思,只需将这些文件移动到c:\windows\即可。
  4. 现在,在运行对话框(win+r)或资源管理器地址栏中键入sudo即可运行此命令(这是最好的部分 :))

1
虽然两种解决方案都可以使用,但不幸的是它们将导致 UAC 对话框出现在顶部(按 Z 序排序),但没有得到 焦点。(在 Win10x64 v1607 build14393.447 上进行了测试。) - Ogmios
2
我将这个打包成了一个可安装的解决方案:https://webinstall.dev/sudo/ - coolaj86
@coolaj86 太棒了。如果我的回答对你有所帮助,甚至只是部分帮助,请在链接中注明我的来源。 - Dheeraj Bhaskar
3
请不要使用从网络上下载的随意可执行文件来“帮助你提升权限”。这是一种非常糟糕的做法。 - Jeter-work
1
@Tims 这告诉PowerShell打开,并且-Command使其在会话的第一行上运行“Start-Process cmd "/k cd /d %cd%" -Verb RunAs”。这反过来启动了一个提升的cmd.exe,/k使cmd.exe在会话的第一行上运行“cd /d %cd%”。在操作的某个时候(我认为是在操作的PowerShell部分),%cd%被扩展为您启动的工作目录,因此您不必返回该目录。我不确定这有多健壮,但它以某种方式起作用。 - Twisted Code
显示剩余8条评论

40
根据文档,Windows安全模型并不会一直授予管理员权限。即使管理员执行不需要提升权限的非管理员任务时,他们也是在标准权限下运行的。
创建新任务对话框(任务管理器 > 文件 > 运行新任务)中有使用管理员特权创建此任务选项,但没有内置的方法可以有效地使用命令行提升权限。
然而,有一些第三方工具(在内部依赖于Windows API)可以用来从命令行提升权限:

NirCmd:

  1. 下载并解压它。
  2. nircmdc elevate cmd

windosu:

  1. 安装它:npm install -g windosu (需要安装node.js)
  2. sudo cmd

3
谢谢,nircmdc elevate route delete 0.0.0.0 mask 0..0.0 192.168.1.1 终于奏效了。其他使用 runas /user:... 的方法会提示输入密码,尽管已经是管理员身份(批处理模式被阻止)。 - Marcos
4
安装nircmd后,想要使其像Linux中的sudo一样运行,请在您的路径中创建一个名为sudo.bat的文件,并将以下内容复制进去:nircmd elevate %*。然后您就可以执行类似于sudo net stop W3SVC 的命令了。 - Kip
1
我认为Windows是到目前为止最简单、最优雅的方式来做这件事,特别是如果你是一名开发者...谢谢,兄弟。我感觉自己就像在Linux操作系统上一样 :D - Emmanuel Mahuni
喜欢 windosu :) - Finlay Roelofs
2
请不要使用从网上下载的随意可执行文件来“提升权限”。这是一种非常糟糕的做法。 - Jeter-work
显示剩余2条评论

18

我经常使用 Nirsoft 程序(例如 nircmdc)和 Sysinternals 程序(例如 psexec),它们非常有帮助。

但是,如果您不想或者不能下载第三方程序,这里有另一种纯 Windows 的方式。

简短回答:当您处于管理员权限时,可以创建一个带有提升权限的预定任务,稍后在非管理员权限下调用。

中等长度的回答:当您处于管理员权限时,可以创建任务(但我更喜欢任务计划程序 GUI):

schtasks /create /sc once /tn cmd_elev /tr cmd /rl highest /st 00:00

之后,无需提升权限,使用以下命令调用:

schtasks /run /tn cmd_elev

长篇回答: 有很多琐碎的细节; 可以参考我的博客文章 "无需UAC启动程序,在系统启动和批处理文件中非常有用(使用任务计划程序)"


@Xalorous 这个解决方案不使用任何外部软件。 - spicy.dll
@Jeter-work schtasks 是一个内置的 Windows 可执行文件。 - GreatAndPowerfulOz
我熟悉任务计划程序,我想我可能回复了错误的答案。 - Jeter-work

12
以下是一个批处理文件,将打开提升的命令提示符,并将路径设置为与调用批处理文件的目录相同。
set OLDDIR=%CD%
powershell -Command "Start-Process cmd -ArgumentList '/K cd %OLDDIR%' -Verb RunAs "

2
“cd %OLDDIR%” 部分应该改为 “cd /D %OLDDIR%”。这样,即使批处理文件是从 cmd 的默认驱动器(通常为 C:)以外的驱动器调用,它也可以正常工作。 - Louis Strous

7

Dheeraj Bhaskar提供的两种解决方案都可以工作,但不幸的是它们将导致UAC对话框显示在顶部(按Z顺序),但没有获得焦点(焦点窗口是调用者cmd/powershell窗口),因此我需要抓住鼠标并单击“是”,或使用Alt+Shift+Tab选择UAC窗口。(在Win10x64 v1607 build14393.447上测试;UAC =“[...]不要变暗[...]”。)

以下解决方案有点笨拙,因为它使用了两个文件,但它保留了正确的焦点顺序,因此不需要额外的鼠标/键盘操作(除了确认UAC对话框:Alt+Y)。

  1. cmdadm.lnk(快捷方式属性/高级.../以管理员身份运行= ON) %SystemRoot%\System32\cmd.exe /k "cd /d"
  2. su.bat @start cmdadm.lnk %cd%

使用su运行。


很遗憾,我无法重现这个问题。无论我使用我的任何解决方案,我的UAC提示都会被聚焦并置于顶部。 - Dheeraj Bhaskar
或者你可以关闭用户帐户控制(UAC)……只是一个想法… :) - GreatAndPowerfulOz
1
关闭用户账户控制(UAC)是一个巨大的安全风险。 - Ghazali

7

通过使用/savecred开关,使批处理文件保存实际管理员帐户的凭据。这将在第一次提示输入凭据后将加密密码存储在凭据管理器中。然后,在所有后续运行批处理时,它将作为完整的管理员运行,但不提示输入凭据,因为他们被加密存储在凭据管理器中,终端用户无法获得密码。以下内容将打开具有完全管理员权限的升级CMD,并仅在第一次提示输入密码:

START c:\Windows\System32\runas.exe /user:Administrator /savecred cmd.exe

6
我的推荐方式是使用来自SysInternals的PsExec.exe,可以在http://technet.microsoft.com/en-us/sysinternals/bb897553获取。它可以帮助您在IT方面做些事情。
.\psexec.exe -accepteula -h -u "$username" -p "$password" cmd.exe

“-h”开关是实现这一操作的关键:
“-h”如果目标系统为Vista或更高版本,则使用帐户的提升令牌(如果可用),运行该进程。

1
要使其正常工作,您必须编辑psexec.exe的属性,并在兼容性选项卡中勾选“以管理员身份运行”。否则,您将会收到错误提示:PSEXESVC未安装。但是,psexec会导致cmd.exe中的tab键出现问题。无法使用tab键来完成文件夹名称。 - Peter Quiring
不确定您尝试的是哪个环境,但我不需要更改“以管理员身份运行”的设置(您是否正在尝试从远程计算机上运行cmd.exe?)。同时,我也没有遇到Tab键的问题,我可以成功地完成文件和文件夹名称的输入(至少在Win8.1和Win10上进行了测试,从cmd和PowerShell命令行都可以运行)。 - David Rodriguez
我正在使用Win10并在本地运行。不确定为什么这种情况会发生在我身上而不是你身上。我确实让nircmd工作了,它不会导致选项卡问题。 - Peter Quiring
1
我还注意到不能使用tab键自动完成,但是至少这将在另一个用户的上下文中打开升级的cmd提示符,而上述先前的方法似乎没有实现当我尝试时。'-h'标志非常好(Windows 10),效果很棒。 - user1840734

4

Dheeraj Bhaskar在使用PowerShell时的方法存在一个问题,至少在Windows 10的PowerShell版本中存在一个缺失的空格。

他的sudo.bat中的命令行应该为

powershell.exe -Command "Start-Process cmd \"/k cd /d %cd% \" -Verb RunAs"

请注意%cd%后面的额外空格。
;)Frode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接