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

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

371417 次浏览

浏览到 C:\windows\System32,右键单击 cmd.exe并以管理员身份运行。

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

您所需要做的就是使用 runas命令以管理员身份运行程序(附带说明)。

runas /user:Administrator "cmdName parameters"

对我来说,这是

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

注意,您必须使用引号,否则 runas 命令将吞噬掉 cmd 的 switch 选项。

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

注意: 启用管理帐户

以这种方式使用 runas 需要启用管理帐户,这不是 Windows7或 Vista 的默认设置。然而,给你是一个关于如何启用它的很好的教程,有三种不同的方式:

我自己通过打开 管理工具本地保安政策,然后导航到 本地政策保安方案并将 帐户: 行政帐户状况策略的值更改为 Enable 来启用它,这不是链接中显示的三种方式中的任何一种。

更简单的方法是:

C:> net user Administrator /active:yes

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

另外,如果您将其作为一个计划任务(可以通过代码设置)执行,则可以选择将其提升到那里运行。

批处理/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

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

:: ------- 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-evating.bat“ path with space”arg234“ another long forum”

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

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

简单的管道技巧,||,和一些。在您的批次顶部使用的 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为 tem.vbs。

虽然 @ amr Ali’s代码很棒,但是我有一个实例,我的 bat 文件包含 > <标志,出于某种原因它卡住了它们。

我找到了这个,只要把它放在你的代码前面,它就完美地工作了。

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

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

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

在任务栏中固定:)

我个人对任何建议的解决方案都不满意,所以我跟踪并找出微软本身是如何在没有任何确认的情况下作为管理员运行一些命令的。

下面是我最终从 windows 注册表中发现的内容:

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

NirCmd Www.nirsoft.net提供升高 使用 nircmdc

您可以通过它的 CLI powershell.exe调用 PowerShell,以便调用它的 Start-Process cmdlet,它支持以提升方式启动进程; 这样做有两个优点:

  • 您不需要使用聪明但晦涩的技巧将两种不同环境的语言组合在一个文件中的 混血儿批处理文件。

  • 您可以将 -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-see line 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%