如何以管理员身份从 Windows 命令行运行命令?

Posted

技术标签:

【中文标题】如何以管理员身份从 Windows 命令行运行命令?【英文标题】:How do you run a command as an administrator from the Windows command line? 【发布时间】:2011-08-22 02:22:06 【问题描述】:

我有一个小脚本,可以在 Windows 上为我正在管理的 Bazaar 存储库执行构建和安装过程。我正在尝试以提升的管理权限从 in Windows shell (cmd.exe) 运行脚本——就像我右键单击它并选择 以管理员身份运行一样,但不使用任何需要使用图形界面的方法。

【问题讨论】:

要以管理员身份运行命令,我为 Windows 制作了一个类似sudo 的工具,可作为 Chocolatey 包使用:***.com/a/54642324/1768303 @noseratio 虽然您的评论不符合问题的精神,但它看起来像是一个方便的工具。 【参考方案1】:

按下开始按钮。在搜索框中输入“cmd”,然后按 Ctrl+Shift+Enter

【讨论】:

不是操作员所质疑的,但无论如何 - 很高兴知道这个快捷方式! - 谢谢 这不会试图回答所提出的问题,并且真的不应该是评分最高的答案。 -1【参考方案2】:

您所要做的就是使用runas 命令以管理员身份运行您的程序(但要注意)。

runas /user:Administrator "cmdName parameters"

就我而言,这是

runas /user:Administrator "cmd.exe /C %CD%\installer.cmd %CD%"

请注意,您必须使用引号,否则 runas 命令会将开关选项吞噬到 cmd。

另请注意,管理 shell (cmd.exe) 在 C:\Windows\System32 文件夹中启动。这不是我想要的,但很容易将当前路径传递给我的安装程序,并使用绝对路径引用它。

警告:启用管理员帐户

以这种方式使用 runas 需要启用管理帐户,这不是 Windows 7 或 Vista 上的默认设置。但是,here 是一个很棒的教程,介绍了如何通过三种不同的方式启用它:

我自己通过打开管理工具本地安全策略,然后导航到本地策略\安全选项并更改Accounts: Administrative Account Status 策略启用,这不是链接中显示的三种方式。

实现此目的的更简单方法:

C:> net user Administrator /active:yes

【讨论】:

有没有办法以不同的用户(具有管理员权限)而不是管理员身份运行?这对于我们的工作计算机来说非常重要...... 我想是的。试试看,看看它是否有效。但是,IDK 用户需要哪些特定权限才能运行特定命令或获得“管理员身份”。 这行得通,但它并不完全像 linux。我注意到它在使用过程中的打嗝。同样,在命令执行前大约有 5 秒的暂停。请自行决定使用它。 打嗝是对的!除非 shell (explorer.exe) 也以管理员用户身份运行,否则某些程序将无法以提升的权限运行。 (例如:control.exe。)但是,就我最初的目的(无缝安装)而言,Ander's answer 更适合。【参考方案3】:

批处理/WSH 混合体能够调用 ShellExecute 以显示 UAC 提升对话框...

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0"
    @goto :EOF
)
echo.Performing admin tasks...
REM call foo.exe
@goto :EOF
@end @ELSE
ShA=new ActiveXObject("Shell.Application")
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+"\"","","runas",5);
@end

【讨论】:

请问@Anders,请告诉我这个脚本的工作要求是什么? a) Windows 版本,b) 已安装 Visual Basic 或 .NET,c) 已安装 Java。在我看来,似乎只有一个 Windows 正在运行,但我不确定。谢谢。 @SopalajodeArrierez:在 Win2000 中添加了 runas 动词,在 Win98/IE4 IIRC 中添加了 cscript.exe。 谢谢,@Anders。拜托,一个小问题:我正在尝试将您的脚本与我自己的程序一起使用(调用执行 Windows shell .exe 的 .lnk 文件),但我无法设置我的首选 icon ,就像我对任何 .lnk 文件所做的那样。这是:图标被分配给 .lnk,但在执行期间(接受 UAC 提示后)运行窗口具有通常的 CMD 图标。有没有办法解决这个问题? 我认为 NT 的早期版本在 STARTUPINFO 中使用了一个未记录的标志来在控制台中设置一个图标,但在 NT4 或 NT5 中对该图标的支持已失效。如果您已经有自己的程序,为什么不能在那里执行管理员检查? .pif 文件可能仍然可以设置图标,但我不知道 64 位 Windows 是否支持 .pif 文件... 批处理文件中的 @ 前缀关闭该命令的回显,@ 是 Windows 脚本主机 (msdn.microsoft.com/en-us/library/58dz2w55) 中用于“预处理器”指令的前缀。 @if (1==1) 在批处理和 WSH 中都是合法的语法,其余的用于使脚本根据实际运行的脚本处理器执行批处理或 WSH 代码。 (批处理文件调用WSH(如果在这种情况下需要)再次调用批处理文件,在使用特殊动词执行后第二次)【参考方案4】:
:: ------- Self-elevating.bat --------------------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :admin
set "ELEVATE_CMDLINE=cd /d "%~dp0" & call "%~f0" %*"
findstr "^:::" "%~sf0">temp.vbs
cscript //nologo temp.vbs & del temp.vbs & exit /b

::: Set objShell = CreateObject("Shell.Application")
::: Set objWshShell = WScript.CreateObject("WScript.Shell")
::: Set objWshProcessEnv = objWshShell.Environment("PROCESS")
::: strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
::: objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas"
:admin -------------------------------------------------------------

@echo off
echo Running as elevated user.
echo Script file : %~f0
echo Arguments   : %*
echo Working dir : %cd%
echo.
:: administrator commands here
:: e.g., run shell as admin
cmd /k

对于一个演示:self-elevating.bat "带空格的路径" arg2 3 4 "another long argument"

这是另一个不需要创建临时文件的版本。

<!-- : --- Self-Elevating Batch Script ---------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :admin
set "ELEVATE_CMDLINE=cd /d "%~dp0" & call "%~f0" %*"
cscript //nologo "%~f0?.wsf" //job:Elevate & exit /b

-->
<job id="Elevate"><script language="VBScript">
  Set objShell = CreateObject("Shell.Application")
  Set objWshShell = WScript.CreateObject("WScript.Shell")
  Set objWshProcessEnv = objWshShell.Environment("PROCESS")
  strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
  objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas"
</script></job>
:admin -----------------------------------------------------------

@echo off
echo Running as elevated user.
echo Script file : %~f0
echo Arguments   : %*
echo Working dir : %cd%
echo.
:: administrator commands here
:: e.g., run shell as admin
cmd /k

【讨论】:

第二个版本真的很棒。看看那个美化cscript "self-elevating.bat?.wsf" 部分。 纯文本.bat和XML.wsh混入内容也很华丽。 find "S-1-16-12288" 的 SID 是什么?当我使用whoami /groups时它不会出现。 这很酷。我会将 ELEVATE_CMDLINE 更改为 cd 到 %cd% ,以便初始调用中的相对路径正确。【参考方案5】:

虽然@amr ali's 代码很棒,但我有一个实例,其中我的 bat 文件包含 &gt; &lt; 标志,但出于某种原因它卡住了它们。

我发现了这个。只需将其全部放在您的代码之前,它就可以完美运行。

REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B
:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

【讨论】:

【参考方案6】:

我会设置一个快捷方式,无论是 CMD 还是您要运行的东西,然后将快捷方式的属性设置为需要管理员,然后从批处理文件中运行快捷方式。我还没有测试确认它会尊重属性,但我认为它更优雅,不需要激活管理员帐户。

此外,如果您将其作为计划任务执行(可以通过代码设置),则可以选择在此处提升运行它。

【讨论】:

好吧,我的目标是完全从命令行完成。我不能指望使用我的安装程序的每个人在运行我的安装程序之前都遵循这个过程。 @Kate - 我实际上和你有同样的想法,今天在win2012服务器上尝试这个,但不幸的是,它不起作用。即使您将快捷方式设置为“以管理员身份运行”,命令提示符仍然在没有管理员权限的情况下运行。这是我尝试通过任务计划程序使用快捷方式的时候。任务计划程序必须在幕后做一些事情以防止它以管理员身份运行,我不确定。【参考方案7】:

简单的管道技巧,||,在您的批次顶部使用了一些 .vbs。它将退出常规并以管理员身份重新启动。

@AT>NUL||echo set shell=CreateObject("Shell.Application"):shell.ShellExecute "%~dpnx0",,"%CD%", "runas", 1:set shell=nothing>%~n0.vbs&start %~n0.vbs /realtime& timeout 1 /NOBREAK>nul& del /Q %~n0.vbs&cls&exit

它也del /Q temp.vbs 当它完成使用它。

【讨论】:

这太邪恶了!你介意更深入地解释一下那条线吗?【参考方案8】:

浏览到C:\windows\System32 并右键单击cmd.exe 并以管理员身份运行。在 Windows 7 上为我工作。

如果您尝试以提升的权限运行脚本,您可以对脚本文件执行相同操作,或使用调度程序的运行作为不同的用户选项来运行脚本。

【讨论】:

这很好,但不是我可以从命令行中执行的操作,例如,从安装脚本中。唯一需要的用户干预是确认提升 - 类似于在 Windows 6/7 上安装任何程序时。【参考方案9】:

我刚刚在我的桌面上创建了一个快捷方式,目标是这一行:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command Start-Process -verb RunAs wt

然后固定在任务栏中:)

【讨论】:

该快捷方式在原始问题的上下文中既不必要且不可用,该问题是关于使安装程序在最终用户的系统上运行。但是,该命令很有趣。看起来这是对已接受答案的简化。那是对的吗?它会打开 UAC 对话框吗?【参考方案10】:

我个人对任何建议的解决方案都不满意,所以我追踪并了解了微软自己是如何在没有任何确认的情况下以管理员身份运行某些命令的。

这是我最终从 Windows 注册表中找到的:

*RunAs "D:\Path\To\app.exe"
*RunAs "D:\Path\To\app.exe" [YourCommandArgs]

【讨论】:

以上是关于如何以管理员身份从 Windows 命令行运行命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 vbs 以管理员身份运行 vbs?

如何以管理员身份从命令行查询 Firestore

win7如何关闭测试模式

如何使用 Nodejs 和 spawn 在 Windows 10 上以管理员身份运行一些 CMD 命令?

怎样让win8系统默认以管理员身份启动DOS命令行窗口

如何以管理员身份运行cmd