Как выполнить команду от имени администратора из командной строки Windows?
У меня есть небольшой скрипт, который выполняет процесс сборки и установки на Windows для базар репозиторий я управляю. Я пытаюсь запустить скрипт с повышенными правами администратора от внутри оболочка Windows (cmd.ехе) - так же, как если бы я щелкнул правой кнопкой и выбрал Запуск от имени администратора, но без использования какого-либо метода, который требует использования графического интерфейса.
8 ответов:
пакета/выключатели гибрид может вызвать 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
все, что вам нужно сделать, это использовать
runasкоманда для запуска программы от имени администратора (с оговоркой).runas /user:Administrator "cmdName parameters"в моем случае, это был
runas /user:Administator "cmd.exe /C %CD%\installer.cmd %CD%"обратите внимание, что вы должны использовать кавычки, иначе команда runas сожрет параметр switch в cmd.
также обратите внимание, что административная оболочка (cmd.exe) запускается в C:\Windows\System32 папка. Это не то, что я хотел, но было достаточно легко пройти по текущему пути к моему установщику, и ссылаться на него, используя абсолютный путь.
внимание: включить учетную запись администратора
использование runas таким образом требует включения учетной записи администратора, которая не является стандартной для Windows 7 или Vista. Однако,здесь это отличный учебник о том, как включить его, тремя различными способами:
Я сам включил его, открыв Администрирование,Локальная Политика Безопасности, затем перейдя к местные Политики\Параметры Безопасности и меняем значение Учетные Записи: Статус Учетной Записи Администратора политика включена, что ни один из трех способов, показанных в ссылке.
еще более простой способ:
C:> net user Administrator /active:yes
:: ------- 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для демонстрации: самоподъемный.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
Я бы настроил ярлык, либо на CMD, либо на то, что вы хотите запустить, а затем установил свойства ярлыка для require admin, а затем запустил ярлык из вашего пакетного файла. Я не проверял, чтобы подтвердить, что он будет уважать свойства, но я думаю, что это более элегантно и не требует активации учетной записи администратора.
кроме того, если вы делаете это как запланированную задачу (которую можно настроить из кода), есть возможность запустить ее с повышенными правами.
хотя @АМР Али!--5--> код был велик, у меня был экземпляр, где мой файл 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" :--------------------------------------
простой трюк трубы,
||, С некоторых .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темп.vbs, когда это делается с его помощью.
обзор
C:\windows\System32и щелкните правой кнопкой мыши наcmd.exeи запуск от имени администратора. Работал для меня на Windows 7.Если вы пытаетесь запустить сценарий с повышенными привилегиями, вы можете сделать то же самое для файла сценария или использовать запуск планировщика как другой пользовательский параметр для запуска сценария.
Comments