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.
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 0 ( 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 0 ( 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
8 commentaires
Bonjour,
Merci pour ce script, que je vais mettre dans un coin de mon ordi.
@+
Sympa le script 🙂 je te dirais si il tourne sur du 8 🙂
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,
@Tee Shirt OBEY: si attrib fonctionne le script ne retourne rien, s'il n'a pas les permissions (exécution sans le mode admin) il retourne :
Accès refusé - C:\Windows\System32
donc rechercher "system32" reste universel et fonctionne parfaitement.
Bonjour,
J'ai testé le script avec comme rajout mes lignes à lancer en admin mais il me demande toujours des droits supplémentaires. Pensez-vous que cela vient de l'exécution du contenu du VBS qui lui va faire des modifications en regedit ?
Merci,
::put your main script here
@echo on
del "c:\scan\*.txt" /F /Q
cscript.exe "c:\scan\script.vbs"
ping 127.0.0.1 -n 70 > nul
move /y c:\scan\*.txt \\srv\test
exit
pause
@Bartoch: cela ne bypass pas les droits admin, pour cela il faudra que tu désactives l'UAC (déconseillé pour des questions de sécurité)
Bonjour,
pour le version avec openfiles, il ne vaudrait pas mieux mettre
IF %ERRORLEVEL% NEQ 0
plutot que
IF %ERRORLEVEL% NEQ 1
@Régis C: tout à fait j'ai corrigé la coquille merci 👍