(modifié le 10 décembre 2019 à 23:55)

Avec l'implémentation de l'UAC dans Windows le lancement de fichiers batch est parfois chaotique. Doit-on lancer le batch en tant qu'utilisateur ou en tant qu'administrateur ? On peut l'environnement de l'utilisateur en administrateur, lecteurs réseaux y compris.

batch-execute-admin

Comment savoir si le script batch a été lancé avec les permissions administrateur ? Voici une solution qui fonctionnera sous Windows Vista, 7, 2008, 2008 R2 (et probablement Windows 8 et Server 2012 mais non testé) :

@ECHO OFF
REM Source Blogmotion.fr
:CHECKPERMISSION
        ATTRIB %windir%\system32 -h | FINDSTR /I "system32" >nul
        IF %ERRORLEVEL% NEQ 1 (
                ECHO.
                ECHO Ce script doit etre lance en Administrateur.
                ECHO.
                GOTO FIN
        )
echo ON EST EN ADMIN, PLACER LA SUITE DU SCRIPT ICI!
:FIN
pause

Explications

En tentant de retirer l'attribut de dossier caché (avec ATTRIB) sur un répertoire protégé du système on analyse le retour de la ligne de commande qui indiquera "Accès refusé - C:\Windows\System32". Dans ce cas la chaîne "system32" sera présente. J'aurai pu analyser le mot "refusé" mais le script ne fonctionnerait qu'avec un système en langue française, grâce à cette astuce il est multilingue et l'emplacement du dossier "windows" n'est pas un problème non plus, remplacé par %windir%

Si le script est exécuté en tant qu'Administrateur alors rien n'est retourné par FINDSTR.

Simple, pratique et efficace !

Et si vous voulez forcer l'exécution du script avec le droit admin sans que l'utilisateur le relance, optez pour ce script (source) :

@echo off
:: src: http://pcloadletter.co.uk/2012/12/11/uac-elevation-for-batch-script/
 
::Windows XP doesn't have UAC so skip
for /f "tokens=3*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| Find "ProductName"') do set WINVER=%%i %%j 
echo %WINVER% | find "XP" > nul && goto commands
 
::prompt for elevation
if "%1" == "UAC" goto elevation
(
 echo Set objShell = CreateObject^("Shell.Application"^)
 echo Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
 echo strPath = objFSO.GetParentFolderName^(WScript.ScriptFullName^)
 echo If objFSO.FileExists^("%~0"^) Then
 echo objShell.ShellExecute "cmd.exe", "/c """"%~0"" UAC ""%~dp0""""", "", "runas", 1
 echo Else
 echo MsgBox "Script file not found"
 echo End If
) > "%TEMP%\UAC.vbs"
cscript //nologo "%TEMP%\UAC.vbs"
goto :eof
:elevation
del /q "%TEMP%\UAC.vbs"
 
:commands
::navigate back to this script's home folder
%~d2
cd "%~p2"
 
:: placer ici la suite de votre script
echo 1st arg: %1
echo 2nd arg: %2
pause

note : il existe une autre méthode basée sur "net session", encore plus courte.

Version alternative

Avec openfiles (source) :

@ECHO OFF
REM Source Blogmotion.fr
:CHECKPERMISSION
        openfiles >nul 2>&1
        IF %ERRORLEVEL% NEQ 1 (
                ECHO.
                ECHO Ce script doit etre lance en Administrateur.
                ECHO.
                GOTO FIN
        )
echo ON EST EN ADMIN, PLACER LA SUITE DU SCRIPT ICI!
:FIN
pause

Version Alternative bis

Avec reg query :

reg query HKU\S-1-5-19 1>nul 2>nul || (echo Erreur&goto :Admin)

:Admin
echo Ce script doit etre lance en Administrateur.

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter