Come si esegue un comando come amministratore dalla riga di comando di Windows?

Ho un piccolo script che esegue il processo di compilazione e installazione su Windows per un repository di Bazaar che sto gestendo. Sto cercando di eseguire lo script con privilegi amministrativi elevati dalla shell di Windows (cmd.exe), proprio come se avessi fatto clic con il pulsante destro del mouse e scelto Esegui come amministratore , ma senza utilizzare alcun metodo che richiede l’uso di l’interfaccia grafica.

Un ibrido batch / WSH è in grado di chiamare ShellExecute per visualizzare la finestra di dialogo di elevazione 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 

Tutto quello che devi fare è usare il comando runas per eseguire il tuo programma come amministratore (con un avvertimento).

 runas /user:Administrator "cmdName parameters" 

Nel mio caso, questo era

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

Si noti che è necessario utilizzare Virgolette, altrimenti il ​​comando runas divorerà l’opzione switch in cmd.

Si noti inoltre che la shell amministrativa (cmd.exe) viene avviata nella cartella C: \ Windows \ System32. Questo non è quello che volevo, ma è stato abbastanza facile passare il percorso corrente al mio programma di installazione e fare riferimento ad esso utilizzando un percorso assoluto.

Avvertenza: abilitare l’account amministratore

L’utilizzo di runas in questo modo richiede l’abilitazione dell’account amministrativo, che non è l’impostazione predefinita su Windows 7 o Vista. Tuttavia, ecco un ottimo tutorial su come abilitarlo, in tre modi diversi:

Io stesso l’ho abilitato aprendo Strumenti di amministrazione , Criteri di sicurezza locali , quindi navigando in Criteri locali \ Opzioni di sicurezza e cambiando il valore degli account: Criterio di stato dell’account amministrativo su Abilitato, che non è uno dei tre modi mostrati nel collegamento.

Un modo ancora più semplice:

 C:> net user Administrator /active:yes 

Premere il pulsante di avvio. Nella casella di ricerca digita “cmd”, quindi premi CTRL + MAIUSC + INVIO

 :: ------- 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 :: eg, run shell as admin cmd /k 

Per una demo: self-elevating.bat “percorso con spazi” arg2 3 4 “altro lungo argomento”

E questa è un’altra versione che non richiede la creazione di un file temporaneo.

   :admin ----------------------------------------------------------- @echo off echo Running as elevated user. echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd% echo. :: administrator commands here :: eg, run shell as admin cmd /k 

Vorrei impostare una scorciatoia, sia per CMD o per la cosa che si desidera eseguire, quindi impostare le proprietà del collegamento per richiedere l’amministratore e quindi eseguire il collegamento dal file batch. Non ho testato per confermare che rispetterà le proprietà, ma penso che sia più elegante e non richiede l’triggerszione dell’account Administrator.

Inoltre, se lo fai come attività programmata (che può essere impostata dal codice), esiste un’opzione per eseguirla qui.

Sebbene il codice di @amr ali fosse ottimo, avevo un’istanza in cui il mio file bat conteneva > < segni, e per qualche ragione soffocò su di loro.

Ho trovato questo invece. Basta mettere tutto prima del codice e funziona perfettamente.

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

Passare a C:\windows\System32 e fare clic con il tasto destro su cmd.exe ed eseguire come amministratore. Ha funzionato per me su Windows 7.

Se si sta tentando di eseguire uno script con privilegi elevati, è ansible fare lo stesso per il file di script o utilizzare l’esecuzione dello scheduler come opzione utente diversa per eseguire lo script.

Trucchetto semplice, || , con alcuni .vbs utilizzati nella parte superiore del tuo batch. Uscirà regolarmente e si riavvierà come amministratore.

 @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 

Anche del /Q temp.vbs quando ha finito di usarlo.