19/09/2024

PowerShell

Comment vérifier si un script PowerShell est exécuté en tant qu’administrateur ?

I. Présentation

Dans ce tutoriel, nous allons créer une fonction PowerShell pour vérifier si un script PowerShell est exécuté en tant qu'administrateur.

Dans de nombreux scénarios, un script PowerShell peut avoir besoin de privilèges élevés pour exécuter certaines tâches et actions. De ce fait, s'il n'est pas exécuté en tant qu'administrateur, il ne s'exécutera pas correctement : grâce à cette vérification, nous allons pouvoir effectuer ce contrôle dès le lancement du script PowerShell.

👉 Si vous souhaitez apprendre PowerShell, découvrez notre cours complet :

II. Le code PowerShell

Désormais, nous allons écrire le code permettant d'atteindre notre objectif du jour ! Tout d'abord, nous allons stocker dans la variable "$UserCurrentPrincipal" la liste des permissions correspondantes à l'utilisateur utilisé pour exécuter le script PowerShell. Autrement dit, il s'agit du compte utilisé pour lancer "powershell.exe" (voire même le code via Windows PowerShell ISE).

$UserCurrentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())

Ensuite, nous allons parcourir cet objet pour déterminer si oui ou non, cet utilisateur dispose du rôle "Administrator" sur la machine locale. La méthode "IsInRole" va retourner un booléen (vrai ou faux), ce qui permettra de déterminer si le compte est administrateur (vrai) ou non (faux).

Remarque : que ce soit une installation de Windows en anglais, en français ou dans une autre langue, le nom du rôle est "Administrator".

$UserIsAdmin = $UserCurrentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Maintenant que nous avons compris le principe de ces deux lignes, sachez que nous pouvons effectuer la même opération sur une seule ligne, voici le code :

$UserIsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")

Vous l'aurez compris, la variable "$UserIsAdmin" contient "true" ou "false" selon le contexte d'exécution du code PowerShell. Il ne reste plus qu'à inclure ce code dans une structure conditionnelle "if" pour évaluer le résultat.

Avant cela, nous allons inclure ce code dans une fonction nommée "Test-AdminContext" qui retournera uniquement la valeur de la variable "$UserIsAdmin".

function Test-AdminContext {
    $UserIsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
    return $UserIsAdmin
}

Puis, nous pouvons appeler cette fonction dans une structure conditionnelle. Grâce au bout de code ci-dessous, l'exécution du script sera immédiatement arrêtée si ce dernier n'est pas exécuté dans un contexte administrateur. Le fait de préciser "$($MyInvocation.MyCommand)" permet d'indiquer le nom du script PS1.

if (-not (Test-AdminContext)) {
    Write-Warning "Le script '$($MyInvocation.MyCommand)' ne peut pas être exécuté car la session PowerShell n'est pas exécutée dans le contexte Administrateur"
    exit
}

Si PowerShell est exécuté en tant qu'administrateur, le script poursuivra son exécution : votre code doit donc être intégré à la suite de la structure conditionnelle.

Une autre façon de faire, ce serait d'inclure le test "if" directement dans la fonction et d'appeler simplement la fonction par son nom :

function Test-AdminContext {
    $UserIsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")

    if (-not ($UserIsAdmin)) {
        Write-Warning "Le script '$($MyInvocation.MyCommand)' ne peut pas être exécuté car la session PowerShell n'est pas exécutée dans le contexte Administrateur"
        exit
    }

}

Test-AdminContext

Vous n'avez plus qu'à exploiter ce bout de code ou à l'adapter selon vos besoins !

III. Conclusion

Cette fonction et ses quelques lignes de code PowerShell sont très pratiques pour effectuer cette vérification au lancement d'un script, lorsque l'exécution en tant qu'administrateur est un prérequis au bon fonctionnement de celui-ci. Désormais, vous n'avez plus qu'à en profiter !

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Comment vérifier si un script PowerShell est exécuté en tant qu’administrateur ?

  • Voici un exemple de code PowerShell pour avoir un script qui redémarre avec les droits admin s’il ne les a pas déjà (dans Windows Terminal).

    param([string] $runas = « false »)
    $is_admin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] « Administrator »)
    if (!$is_admin -and $runas -eq « false »)
    {
    Start-Process -FilePath wt.exe -ArgumentList « pwsh.exe -ExecutionPolicy Bypass -File ` »$PSCommandPath` » ` »true` » » -Verb RunAs
    exit
    }

    Write-Host « Contexte admin ok… »

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.