Exécuter le script PowerShell en tant qu'administrateur

Marion Paul Kenneth Mendoza 30 janvier 2023
  1. Utilisation de la cmdlet Start-Process pour exécuter le script PowerShell en tant qu’administrateur
  2. Exécuter le script PowerShell avec des arguments en tant qu’administrateur
  3. Exécuter le script PowerShell en tant qu’administrateur tout en conservant le répertoire de travail
Exécuter le script PowerShell en tant qu'administrateur

La plupart des scripts que nous écrivons et exécutons nécessiteront des autorisations, ce qui obligera un administrateur à exécuter les scripts à partir d’une invite PowerShell élevée. Dans PowerShell, nous élevons nos autorisations en exécutant Windows PowerShell avec des privilèges d’administrateur et en saisissant nos informations d’identification d’administrateur.

Cependant, nous devrons peut-être exécuter nos scripts de manière transparente dans des situations spécifiques sans saisir les informations d’identification de l’administrateur. Par conséquent, nous pouvons intégrer diverses commandes d’auto-élévation au début de nos scripts, et nous vous montrerons comment dans cet article.

Utilisation de la cmdlet Start-Process pour exécuter le script PowerShell en tant qu’administrateur

la cmdlet Start-Process lance un ou plusieurs processus, fichiers exécutables ou de script, ou tout fichier qu’un logiciel installé peut ouvrir sur l’ordinateur local, y compris Windows PowerShell.

Avec cette cmdlet et un ensemble de paramètres, nous pouvons exécuter Windows PowerShell en tant qu’administrateur.

Pour cet exemple, nous avons créé un script Hello_World.ps1, qui affichera une simple chaîne Hello World dans notre console.

Hello_World.ps1 :

Write-Output 'Hello World!'

Nous pouvons utiliser le fichier PowerShell ci-dessus comme exemple pour vérifier et vérifier si nous exécutons nos scripts avec des privilèges d’administrateur. Pour commencer, exécutez l’extrait de code ci-dessous.

Remarque : Windows PowerShell peut encore devoir vous demander votre confirmation en raison du contrôle de compte d’utilisateur (UAC) de votre ordinateur local. Nous ne recommandons pas de désactiver entièrement l’UAC pour des raisons de sécurité.

Start-Process powershell -verb RunAs -ArgumentList ".\Hello_World.ps1"

Lors de l’exécution du script ci-dessus, il générera une nouvelle instance de Windows PowerShell avec des droits d’administration. La seule mise en garde pour le script exécuté ci-dessus est que si nous devons transmettre des arguments à notre fichier PowerShell, nous ne transmettrons pas les arguments à la console d’administration nouvellement créée.

Exécuter le script PowerShell avec des arguments en tant qu’administrateur

Cet exemple peut prendre notre précédent script à une ligne et le réviser à l’intérieur de plusieurs instructions conditionnelles.

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $Command = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $Command
        Exit
 }
}

# Place your script here
Write-Output 'Hello World!'

Auparavant, nous exécutions notre script PowerShell en appelant un fichier séparé, mais nous pouvons simplement placer notre script (par exemple, Hello_World.ps1) sous cet extrait pour cet exemple.

Voici comment fonctionne l’extrait.

  • La première instruction if vérifie si le script exécuté est déjà en cours d’exécution dans Windows PowerShell avec des privilèges d’administration.
  • La deuxième instruction if vérifie si le numéro de build du système d’exploitation Windows est 6000 ou supérieur. (Windows Vista ou Windows Server 2008 ou version ultérieure)
  • La variable $Command récupère et enregistre la commande utilisée pour exécuter le script, y compris les arguments.
  • Le Start-Process démarre une nouvelle instance de Windows PowerShell avec des privilèges élevés et réexécute le script comme notre script précédent.

Exécuter le script PowerShell en tant qu’administrateur tout en conservant le répertoire de travail

Nous devrons peut-être conserver le répertoire de travail du script pour des situations spécifiques. Donc, voici un extrait auto-élévateur qui maintiendra le répertoire de travail :

if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
        Exit;
    }
}
# Place your script here
Write-Output 'Hello World!'

Dans cet extrait, nous avons passé $PSCommandPath comme l’un des arguments à l’intérieur de la cmdlet Start-Process pour conserver le répertoire de travail sur lequel le script a été exécuté.

La préservation du répertoire de travail est essentielle pour effectuer des opérations relatives au chemin. Malheureusement, les deux extraits précédents que nous avons montrés précédemment ne conserveront pas leur chemin, ce qui peut provoquer des erreurs inattendues. Par conséquent, vous pouvez utiliser la syntaxe révisée ci-dessus.

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn