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

问题描述 投票:0回答:12

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

runas
cmd windows-7 windows-vista
12个回答
80
投票

runas /user:Administrator "cmdName parameters"

就我而言,这是

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

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

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

注意:启用管理员帐户

以这种方式使用 runas 需要启用管理帐户,这在 Windows 7 或 Vista 上不是默认设置。然而,

这里

是一个关于如何以三种不同方式启用它的很棒的教程:

我自己通过打开管理工具

本地安全策略

来启用它,然后导航到本地策略\安全选项并将帐户:管理帐户状态策略的值更改为已启用,这不是链接中显示了三种方式。 实现此目的的更简单方法: C:> net user Administrator /active:yes

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

73
投票
Shift

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


52
投票

@echo off
:: ------- Self-elevating.bat ---------------------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :gotAdmin
echo Requesting administrative privileges...
set "ELEVATE_CMDLINE=cd /d "%cd%" & call "%~f0" %*"
findstr "^:::" "%~sf0">"%temp%\getadmin.vbs"
cscript //nologo "%temp%\getadmin.vbs" & del "%temp%\getadmin.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"
:gotAdmin -----------------------------------------------------------

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

20
投票
对于演示:self-elevating.bat“带空格的路径”arg2 3 4“另一个长参数”

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

@echo off <!-- : --- Self-elevating.bat --------------------------------------- @whoami /groups | find "S-1-16-12288" > nul && goto :gotAdmin echo Requesting administrative privileges... set "ELEVATE_CMDLINE=cd /d "%cd%" & 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> :gotAdmin ----------------------------------------------------------- @echo off echo Running script as admin. echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd% echo. :: administrator commands here :: e.g., run shell as admin cmd /k

虽然 
@amr ali 的

6
投票
>

< 符号,并且由于某种原因它被它们阻塞了。


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

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" :--------------------------------------

简单的管道技巧,
||

3
投票

@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。

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


2
投票

我刚刚在桌面上创建了一个快捷方式,目标中包含以下行:


2
投票

固定在任务栏后:)



您可以通过其 CLI


1
投票

调用 PowerShell,以调用其

Start-Process
cmdlet,它支持以提升方式启动进程;这样做有两个好处:
您不需要使用巧妙但晦涩的技巧将两种不同环境的语言组合在一个文件中的

hybrid
    批处理文件。
  • 您可以将

    -Wait
  • 放在
  • -Verb RunAs

    之前(见下文),以使提升的重新调用成为

    同步
    ,即等待它退出并将其退出代码传达给调用者。
    
    
    以下内容借用了

    Amr Ali 有用的 WSH 辅助答案
  • 中的技术;保存并运行为
run-elevated.cmd

,例如: @echo off & setlocal :: Check if the current session is already elevated. :: `net session` only succeeds in elevated sessions. net session >NUL 2>&1 && goto :ELEVATED :: Getting here means that we must reinvoke with elevation. :: Add -Wait before -Verb RunAs to wait for the reinvocation to exit. set ELEVATE_CMDLINE=cd /d "%~dp0" ^& "%~f0" %* powershell.exe -noprofile -c Start-Process -Verb RunAs cmd.exe \"/k $env:ELEVATE_CMDLINE\" exit /b %ERRORLEVEL% :: Getting here means that we are (now) running with elevation. :ELEVATED echo === Running in elevated session: echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd%


谈到 Amr Ali 的 WSH 辅助答案;这是一种重新表述,可以使参数传递更加稳健,以便可以传递诸如
"a & b"
之类的参数,并通过避免使用
"^"

来防止在参数中重复

call
字符 - 请参阅第
set ELEVATE_CMDLINE=...
行;此外,除了一些可读性格式之外,还确保不会意外回显原始批处理语句:
<!-- : (":" is required)
@echo off & setlocal
net session >NUL 2>&1 && goto :ELEVATED
set ELEVATE_CMDLINE=cd /d "%~dp0" ^& "%~f0" %*
cscript.exe //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", "/k " & strCommandLine, "", "runas"
  </script>
</job>

:ELEVATED

echo === Running in elevated session:
echo Script file: %~f0
echo Arguments  : %*
echo Working dir: %cd%
    

浏览到 
C:\windows\System32

0
投票
cmd.exe

并以管理员身份运行。在 Windows 7 上为我工作。


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

NirCmd

www.nirsoft.net

0
投票

我个人对任何建议的解决方案都不满意,因此我跟踪并找出微软本身如何以管理员身份运行某些命令而无需任何确认。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.