È 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 garantisce il lavoro in un ambiente standard, con strumenti standard e allo stesso modo in diversi sistemi Windows. Utilizza diversi comandi standard e built-in di Windows. Non utilizzare altri script esterni. Può essere usata per chiamare qualsiasi programma come Amministratore, non solo script Batch. È sufficiente creare un piccolo script, che poi chiama il programma che richiede l'autorizzazione Administartor. Inserirlo in qualsiasi cartella PATH di ricerca (da %PATH%).
Per utilizzarlo, è sufficiente inserire la seguente riga (esattamente come) nel suo script Batch padre, che deve essere eseguito come Administrator. Questo è meglio farlo nella parte superiore del nostro script padre ed è meglio che prima, che sarà chiamato tramite la CALL ulteriormente, alcuni sottoscript (vedi spiegazione dettagliata qui sotto).
net session >nul 2>nul&if errorlevel 1 Batch_Admin "%~0" %*
``` ```
SET ShowAdminInfo=5
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 in corso non ha privilegi di amministratore, ad es. per 5 secondi prima di chiamare Batch_Admin impostare la variabile “ShowAdminInfo” sul numero di secondi
@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)***
``` &001
## Quindi come funziona:
- Chiamate UAC. ShellExecute attraverso VBScript per prelevare i permessi utente
- Batch esegue lo script, o BAT o CMD
- Script caller può avere un lungo spazio dei nomi incluso nella chiamata tra virgolette
- Restituisce tutti i parametri di chiamata dello script master passato dalla linea di comando, come se non ci fosse trasmissione della chiamata e fa partire qualcosa da zero, anche con caratteri speciali, come punti esclamativi (! ) e percentuale (%), e anche con le parentesi ()
- Mantiene la posizione di uno script master se la chiamata è avvenuta nella directory dove questo script è il master
- L'ausiliario visualizza un messaggio se ci si pone davanti la variabile "ShowAdminInfo", ad es. per 5 secondi che può impedire il passaggio immediato dei diritti dell'Amministratore dando informazioni aggiuntive e la possibilità di una decisione informata. Esempi di impostazione che devono essere impostati: SET ShowAdminInfo=5 Di default, poiché questa variabile non è definita, non viene visualizzata.
- Lo script chiama anche nel percorso di ricerca di sistema % PATH% e da risorsa di rete, come ad esempio: \Computer\share\test.bat
- Previene i malintesi nella scrittura dei file ausiliari necessari quando lo script chiama più Batch\_Admin quasi contemporaneamente. Utilizza il numero casuale da 1 a 100
- Ma, la cosa migliore è usarlo sullo script padre. Il passaggio ai diritti di amministratore richiede sempre che si esegua lo script completamente di nuovo, in una nuova finestra, in un nuovo ambiente, senza ricorrere alle variabili impostate in precedenza nel nostro script e i valori di queste variabili non sono passati poi a chiamare come amministratore. Solo lo script verrà eseguito di nuovo.
Di seguito uno script completo Batch\_Admin. Informazioni più dettagliate sono disponibili sul mio sito.
Copiare il seguente testo nel Blocco note e salvarlo su disco come: Batch\_Admin.bat
&001