
I. Présentation
Normalement, ce contrôle est inutile pour les scripts exécutés via le MDT. En effet, celui-ci s’assure que le contexte d’exécution soit toujours réalisé avec le niveau de privilèges maximum.
Depuis Vista, en raison de l’UAC (Contrôle de compte d’utilisateur) vous savez que l’appartenance à un groupe Administrateur n’est pas suffisante pour garantir un niveau de privilège nécessaire à une installation.
II. Tester le niveau de privilège nécessaire à une installation
En batch, cet exemple permet de vérifier que le contexte d’exécution à le niveau de privilège maximum.
@echo off whoami /groups | findstr "S-1-16-12288" > nul && set runLevel=maximum echo Niveau de privilege : %runLevel%
Ou cet exemple plus pédagogique et détaillé
@Echo Off Echo Le compte actuel "%userdomain%\%USERNAME%" whoami /groups /fo list | findstr "Admin" > nul if %errorlevel%==0 (echo est membre d'un groupe Administrateurs) else (echo N'est pas membre d'un groupe Administrateurs) whoami /groups|findstr S-1-16-12288 > nul if %errorlevel%==0 (echo Et dispose d'un niveau de privileges maximum) else (echo Et dispose d'un niveau d'utilisateur standard) Echo Ce compte est aussi membre des groupes suivants whoami /groups /fo list | findstr "groupe:" Pause
En vbscript, la méthode peut être choisie dans la même veine.
Dim oShell, oExec, szStdOut szStdOut = "" Set oShell = CreateObject("WScript.Shell") Set oExec = oShell.Exec("whoami /groups") Do While (oExec.Status = cnWshRunning) WScript.Sleep 100 If not oExec.StdOut.AtEndOfStream Then szStdOut = szStdOut & oExec.StdOut.ReadAll End If Loop Select case oExec.ExitCode case 0 If not oExec.StdOut.AtEndOfStream Then szStdOut = szStdOut & oExec.StdOut.ReadAll end If if instr(szStdOut,"S-1-16-12288") Then WScript.echo "Niveau Elevé (Admin)" Else if instr(szStdOut,"S-1-16-8192") Then wscript.echo "Niveau Moyen (Standard)" else wscript.echo "Niveau inconnu !" end If End If case else if not oExec.StdErr.AtEndOfStream Then wscript.echo oExec.StdErr.ReadAll End If End select
Vous pouvez également vous inspirer de l’exemple fourni ici http://forum.sysinternals.com/tip-start-explorerexe-elevated-with-uac-enabled_topic29229.html
Note : Pour rappel, certains processus tels que “explorer.exe” ne peuvent pas être élevés au sein d’une session. Pour disposer d’un explorateur graphique en mode admin, vous pouvez utiliser des outils alternatifs tels que “Explorer++” (http://explorerplusplus.com/ )
En Powershell, la gestion des privilèges est plus riche.
function isadmin { # Retourne "true" si le contexte dispose du niveau de privilèges Administrateur, "false" sinon ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") }
Depuis PowerShell v4.0, vous pouvez simplement ajouter la directive suivante en début de script :
#Requires -RunAsAdministrator