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

jpa*_*ugh 57 cmd windows-vista windows-7

我有一个小脚本,在Windows上为我正在管理的Bazaar存储库执行构建和安装过程.我试图运行与提升,管理权限的脚本的Windows外壳程序(CMD.EXE) -就好像我右键单击它并选择以管理员身份运行,但不使用,需要使用的任何方法图形界面.

sla*_*tir 58

按开始按钮.在搜索框中输入"cmd",然后按Ctrl+ Shift+Enter

  • 不是什么问题,但无论如何 - 很高兴知道这个捷径!- 谢谢 (4认同)
  • 这并不试图回答所提出的问题,而且实际上不应该是评价最高的答案。-1 (2认同)

jpa*_*ugh 57

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

runas /user:Administrator "cmdName parameters"
Run Code Online (Sandbox Code Playgroud)

就我而言,这是

runas /user:Administator "cmd.exe /C %CD%\installer.cmd %CD%"
Run Code Online (Sandbox Code Playgroud)

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

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

警告:启用管理员帐户

以这种方式使用runas需要启用管理帐户,这不是Windows 7或Vista上的默认帐户.但是,是一个关于如何启用它的一个很好的教程,有三种不同的方式:

我自己通过打开管理工具,本地安全策略,然后导航到本地策略\安全选项并将帐户:管理帐户状态策略的值更改为已启用来启用它,这不是链接中显示的三种方式.

更简单的方法:

C:> net user Administrator /active:yes
Run Code Online (Sandbox Code Playgroud)

  • 有没有一种方法可以以其他用户(具有管理员权限)而不是管理员身份运行?这对于使用工作计算机的我们来说非常重要... (2认同)

And*_*ers 40

批处理/ 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
Run Code Online (Sandbox Code Playgroud)

  • 批处理文件中的 @ 前缀会关闭该命令的回显,而 @ 是 Windows Scripting Host 中用于“预处理器”指令的前缀 (http://msdn.microsoft.com/en-us/library/58dz2w55) 。@if (1==1) 是批处理和 WSH 中的合法语法,其余部分是为了使脚本执行批处理或 WSH 代码,具体取决于实际运行的脚本处理器。(批处理文件调用 WSH(如果在这种情况下需要),在使用特殊动词执行后第二次再次调用批处理文件) (3认同)
  • @SopalajodeArrierez:在Win2000中添加了runas动词,在Win98/IE4 IIRC中添加了cscript.exe. (2认同)

Amr*_*Ali 11

:: ------- 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
Run Code Online (Sandbox Code Playgroud)

对于演示:self-elevating.bat"带空格的路径"arg2 3 4"另一个长论证"

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

<!-- : --- 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
Run Code Online (Sandbox Code Playgroud)

  • 纯文本``.bat```和XML``.wsh```混合内容也很华丽。 (2认同)

小智 6

虽然@amr ali 的代码很棒,但我有一个例子,我的 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"
:--------------------------------------
Run Code Online (Sandbox Code Playgroud)