È possibile eseguire automaticamente un file batch come amministratore


48

Mi chiedo se sia possibile aprire automaticamente un file batch come amministratore quando si fa doppio clic sul file batch, poiché i comandi devono essere eseguiti con diritti amministrativi.

Nota: conosco già la soluzione di fare clic con il pulsante destro del mouse sul file e fare clic su Run As Administrator, ma questa non è una soluzione automatica.



Sono stato in grado di farlo funzionare per me: stackoverflow.com/a/13811519/27928
Rohit,

2
in che modo due clic a sinistra sono più automatici di uno a sinistra e uno a destra?
Jiggunjer,

Risposte:


44

Sì, sei in grado di eseguire un file batch con diritti amministrativi. Sfortunatamente, non puoi farlo direttamente dal file batch stesso. Dovresti prima creare un collegamento a quel file batch e modificare le proprietà di quel collegamento per farlo funzionare.

Per creare un collegamento, esistono molti modi, ma il modo più semplice e veloce è utilizzare l' opzione Invia a nel menu di scelta rapida.

Right click batch file > Send to > Desktop (create shortcut)

Ovviamente puoi inviare il collegamento dove vuoi. Per elevare il file batch da eseguire come amministratore, attenersi alla seguente procedura:

  1. Fai clic con il tasto destro del mouse sul collegamento che hai appena creato (dovrebbe essere sul desktop o ovunque tu lo invii)
  2. Nella scheda Collegamento, fai clic sul pulsante Avanzate ...
  3. Seleziona la casella di controllo Esegui come amministratore e premi OK sia per la finestra modale che per la finestra principale delle proprietà.
  4. Esegui il collegamento facendo doppio clic su di esso e il file batch dovrebbe essere eseguito come amministratore.

1
È sempre possibile forzare il file batch per chiamare il collegamento e fare in modo che il collegamento passi un parametro per sapere di non chiamare il collegamento. Dovresti inserire qualcosa di simile if "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOFproprio sotto @echo offe creare il collegamento di scelta rapida program.bat aanziché solo program.bat.
sinceramente il

2
Ifedi scrive "La risposta accettata [questa da Tech1337] funziona davvero. Ma ho scoperto che in Windows 7, ho dovuto sopportare il dialogo UAC ogni volta che si fa clic sul collegamento." <- Anche se qualcun altro dice che funziona senza UAC
barlop

Per me il collegamento non viene eseguito nella directory corrente quando si fa doppio clic, sebbene lo faccia .bat. Anche con la proprietà "Inizia tra:" sul collegamento compilato. Quindi assicurati che il tuo .bat specifichi i percorsi completi dei file.
Rob Mosher,

29

Come pubblicato in una risposta di Ben Gripka a un'altra domanda:

REM --add the following to the top of your bat file--


@echo off

:: BatchGotAdmin
:-------------------------------------
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"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

Sì, l'ho trovato e lo sto usando currnetly. Grazie comunque!
Antp,

Essenzialmente quello che stavo cercando. Speravo che ci fosse un modo per farlo senza usare VB?
Chef Faraone,

@ChefPharaoh crea una console elevata per eseguire il file batch. Puoi fare lo stesso con uno script PowerShell.
Jiggunjer,

Questa è stata la risposta migliore per me.
Kasperhj,

4

La risposta accettata funziona davvero. Ma ho scoperto che in Windows 7, ho dovuto sopportare la finestra di dialogo UAC ogni volta che si fa clic sul collegamento. Questo IMHO toglie in modo significativo il "automaticamente" in questa domanda!

Quindi ho scoperto che, nella mia situazione, il .batfile in questione deve essere eseguito dall'Utilità di pianificazione. In questo caso, selezionando l' Run with highest privilegesopzione nella Generalscheda dell'attività, il problema si risolve bene. Il .batviene quindi eseguito come amministratore senza problemi.

PS: Non mi ero reso conto di non poter caricare immagini con questa risposta, perché adesso ho uno screenshot carino seduto con me! O posso?


2
Se aggiungi collegamenti alle immagini qualcuno li incorporerà per te.
Ramhound,

@Ramhound. Aggiungi collegamenti alle immagini? L'immagine è sul mio desktop, non da qualche parte online. O sicuramente mi manca qualcosa?
Ifedi Okonkwo,

Sì; Li carichi; Non puoi semplicemente incorporare gli screenshot nella tua risposta.
Ramhound,

O quel pulsante di caricamento non c'era, o ero mezzo cieco ieri! Sono sicuro che era quest'ultimo. Ad ogni modo, ho completato il caricamento del file molto bene, solo per dirmi che avevo bisogno di un rappresentante di 10 per pubblicare le immagini. Grazie comunque.
Ifedi Okonkwo,

Puoi comunque inserire il link nella risposta.
Ramhound,

4

su Windows 7

  1. Crea un collegamento a quel file batch

  2. Fare clic con il tasto destro del mouse sul file di scelta rapida

  3. Fai clic sul pulsante di avanzamento per trovare una casella di controllo per l'esecuzione come amministratore

Controlla lo screenshot qui sotto

Immagine dello schermo


1
Dici lo stesso della risposta accettata.
Antp,

Sì, volevo solo creare un semplice elenco con screenshot per tutti quelli che hanno fretta.
fedmich,

3
Se qualcuno ha fretta dubito che
scorreranno

3

È possibile utilizzare il mio script Batch_Admin per elevare automaticamente l'amministratore per l'utilizzo in qualsiasi tipo di script Batch o BAT o .CMD. Questa funzione assicura il lavoro su un ambiente standard, con strumenti standard e allo stesso modo in diversi sistemi Windows. Utilizza diversi comandi standard e integrati di Windows. Non utilizzare altri script esterni. Può essere utilizzato per chiamare qualsiasi programma come amministratore, non solo per gli script Batch. È sufficiente creare un piccolo script, che quindi chiama il programma che richiede l'autorizzazione Administartor. Inseriscilo in qualsiasi cartella PATH di ricerca (da% PATH%).

Per usarlo, è sufficiente inserire la seguente riga (esattamente come) nello script Batch padre, che deve essere eseguito come amministratore. È meglio farlo nella parte superiore del nostro script genitore ed è meglio prima quello, che verrà chiamato tramite la CHIAMATA più avanti, alcuni sotto-script (vedere la spiegazione dettagliata di seguito).

net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Questo può essere inserito all'interno di qualsiasi script figlio, chiamato dalla sintassi CALL. Per visualizzare un messaggio mentre è ancora non ha i privilegi di amministratore, ad es. per 5 secondi prima di chiamare Batch_Admin impostare la variabile "ShowAdminInfo" sul numero di secondi

SET ShowAdminInfo=5
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Quindi come funziona:

• Chiama UAC.ShellExecute tramite VBScript per raccogliere le autorizzazioni utente

• Batch esegue lo script o BAT o CMD

• Il chiamante script può avere spazi di nomi lunghi inclusi nella chiamata tra virgolette

• Restituisci tutti i parametri per chiamare lo script master passato dalla riga di comando, come se non ci fosse alcuna trasmissione della chiamata e avviare qualcosa da zero, anche con caratteri speciali, come punti esclamativi (!) E percentuale (%), e anche tra parentesi ()

• Conserva una posizione dello script principale se la chiamata è avvenuta nella directory in cui questo script è il master

• Ausiliario visualizza un messaggio se ci poniamo la variabile "ShowAdminInfo", ad es. per 5 secondi che può impedire il passaggio immediato dei diritti dell'Amministratore fornendo ulteriori informazioni e la possibilità di una decisione informata. Esempi di impostazione che devono essere impostati: SET ShowAdminInfo = 5 Per impostazione predefinita, poiché questa variabile non è definita, non viene visualizzata.

• Lo script sta chiamando anche nel percorso di ricerca del sistema% PATH% e da una risorsa di rete, ad esempio: \ Computer \ share \ test.bat

• Previene incomprensioni nella scrittura dei file ausiliari necessari quando lo script chiama diversi Batch_Admin quasi contemporaneamente. Utilizza il numero casuale compreso tra 1 e 100

• Ma, il migliore è usarlo sullo script principale. Il passaggio ai diritti di amministratore richiede sempre di eseguire nuovamente lo script completamente, in una nuova finestra, in un nuovo ambiente, senza ricorrere alle variabili precedentemente impostate nel nostro script e i valori di queste variabili non sono passati quindi per chiamare come amministratore . Solo lo script verrà eseguito di nuovo.

Di seguito uno script completo Batch_Admin. Informazioni estese su questo sono sul mio sito.

Copia il seguente testo nel Blocco note e salvalo sul disco come: Batch_Admin.bat

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatically get admin rights for another Batch. See info inside.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatically get admin rights for script batch. Paste this on top:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Also keep Batch directory localisation and then set variable:   PATH_BAT
::                                if earlier variable "ShowAdminInfo" is empty (not defined) then no info, else showing info with number of seconds
::
::                                Elaboration:  Artur Zgadzaj
setlocal
setlocal DisableDelayedExpansion

SET "Localy="
if exist "%~1"      SET "Localy=YES"
if exist "%~1.BAT"  SET "Localy=YES"
if exist "%~1.CMD"  SET "Localy=YES"
if defined Localy   FOR %%I IN ("%~1") DO SET "PATH_BAT=%%~dI%%~pI"

 SET P1=%~1
 SET Parameters=%*
 SET Parameters=%Parameters:!=^^!%
setlocal EnableDelayedExpansion
 SET Parameters=!Parameters:%P1%=!
 SET Parameters=!Parameters:%%=%%%%!
setlocal DisableDelayedExpansion
 SET Parameters=%Parameters:~3%

net session >nul 2>nul&if not errorlevel 1  goto Administrator_OK

if not defined ShowAdminInfo   goto skip_message_Administrator
echo.
echo Script:  %~1
echo.
echo *****************************************************************
echo ***    R U N N I N G     A S     A D M I N I S T R A T O R    ***
echo *****************************************************************
echo.
echo Call up just as the Administrator. You can make a shortcut to the script and set:
echo.
echo          shortcut ^> Advanced ^> Running as Administrator
echo.
echo     Alternatively run once "As Administrator"
echo     or in the Schedule tasks with highest privileges
echo.
echo Cancel Ctrl-C or wait for launch  %ShowAdminInfo%  seconds ...
TIMEOUT /T %ShowAdminInfo% > nul

:skip_message_Administrator
MD %TEMP% 2> nul
SET /A $Admin$=%RANDOM% * 100 / 32768 + 1

SET "Percent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parameters% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Percent=^"
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul

echo @SET "PATH_BAT=%PATH_BAT%"               > "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
echo @SET "BatchFullName=%BatchFullName%"    >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
if defined Localy  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parameters% %Percent% >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"

echo SET UAC = CreateObject^("Shell.Application"^)                                   > "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
echo UAC.ShellExecute "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat", "", "", "runas", 1 >> "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
"%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
endlocal
exit /B

:Administrator_OK
"%~1" %Parameters%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatically get admin rights  (The End)  ***

Penso che questo sia simile o identico alla risposta sopra: superuser.com/a/852877/375935
jiggunjer

1

In alternativa, è possibile creare un secondo file batch, ciò potrebbe consentire di eseguire qualsiasi cosa come amministratore, inserendo la password amministratore una sola volta. La password viene salvata in un token di autenticazione e richiede a un vero computer di sapere come decifrare.

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"

1
@echo off        
:: BatchGotAdmin        
:-------------------------------------        
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  
chkdsk

Questo funziona anche SOURCE: https://social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file


Puoi spiegare la tua soluzione?
scai,

1
Un'altra versione di superuser.com/a/852877/375935
jiggunjer,

0

È possibile utilizzare un'utilità della riga di comando elevate. (link per il download - https://drive.google.com/open?id=0Bz7qe_olclTwVGZLUklFMHNxQ00 )

Usage: Elevate [-?|-wait|-k] prog [args]
-?    - Shows this help
-wait - Waits until prog terminates
-k    - Starts the the %COMSPEC% environment variable value and
                executes prog in it (CMD.EXE, 4NT.EXE, etc.)
prog  - The program to execute
args  - Optional command line arguments to prog

Questo non fa apparire un panale UAC?
Antp,

che fa apparire ... tuttavia, è meglio di niente (vedere "accesso negato" ..)
T.Todua

Non è davvero "automatico", vero
Antp,

0

È un esempio per eseguire il pipistrello come amministratore. Per me funziona.

Va così:

if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
  echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
:eof
start Cmd /k "netsh wlan show profile"
pause </

cls
Color 0A
@echo off
echo.
cls
set/p ProfileName=Type the name of the current Wifi signal? 
echo.
start Cmd /k "netsh wlan show profile name=%ProfileName% key=clear"
pause </
exit
pause

Benvenuto in Super User! Sebbene ciò possa rispondere alla domanda, sarebbe una risposta migliore se tu potessi fornire qualche spiegazione sul perché lo faccia.
DavidPostill

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.