Как выполнить команду в качестве администратора из командной строки Windows?

У меня есть небольшой script, который выполняет процесс сборки и установки в Windows для Bazaar репозитория, которым я управляю. Я пытаюсь запустить script с повышенными правами администратора из оболочки Windows (cmd.exe) - так же, как если бы я щелкнул правой кнопкой мыши и выбрал "Запуск от имени администратора", но без использования какого-либо метода, который требует использование графического интерфейса.

Ответ 1

Гибрид batch/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

Ответ 2

Нажмите кнопку "Пуск". В поле поиска введите "cmd", затем нажмите Ctrl + Shift + Enter

Ответ 3

Все, что вам нужно сделать, это использовать команду runas для запуска вашей программы в качестве администратора (с оговоркой).

runas /user:Administrator "cmdName parameters"

В моем случае это было

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

Обратите внимание, что вы должны использовать отметки о котировках, иначе команда runas соберет параметр переключателя на cmd.

Также обратите внимание, что административная оболочка (cmd.exe) запускается в папке C:\Windows\System32. Это не то, что я хотел, но было достаточно легко пройти по текущему пути к моему установщику и ссылаться на него с использованием абсолютного пути.

Предостережение для использования runas таким образом: Административная учетная запись должна быть включена, которая не является стандартом для Windows 7 или Vista. Однако здесь - отличный учебник по его включению тремя различными способами:

Я сам включил его, открыв "Администрирование", "Локальная политика безопасности", затем перейдя в "Локальные политики" \ "Параметры безопасности" и изменив значение политики "Учетные записи: политика учетной записи" на "Включено", которая не является ни одним из трех способов, показанных в ссылке.

Еще проще:

C:> net user Administrator /active:yes

Ответ 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 "еще один длинный аргумент"

И это еще одна версия, которая не требует создания временного файла.

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

Ответ 5

Перейдите к C:\windows\System32 и щелкните правой кнопкой мыши по cmd.exe и запустите в качестве администратора. Работал для меня в Windows 7.

Если вы пытаетесь запустить script с повышенными привилегиями, вы можете сделать то же самое для файла script или использовать запуск планировщика как другой пользовательский параметр для запуска script.

Ответ 6

Я бы установил ярлык, либо в CMD, либо в то, что вы хотите запустить, а затем задайте свойства ярлыка, требующие администратора, а затем запустите ярлык из вашего пакетного файла. Я не тестировал, чтобы подтвердить, что он будет уважать свойства, но я думаю, что он более изящный и не требует активации учетной записи администратора.

Также, если вы делаете это как запланированную задачу (которая может быть настроена из кода), есть возможность запустить ее там.

Ответ 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

Хотя код @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"
:--------------------------------------