Comment définir une fonction PowerShell qui nécessite une élévation?

20

Comme je ne trouve aucune alternative à la sudocommande d'élévation de Linux , j'ai la question suivante:

Comment définir une fonction PowerShell qui nécessite une élévation? Je veux dire invite UAC.

Disons, cette fonction suit:

function system-check {
    SFC /ScanNow
}

Système:

Windows 8.1 Pro 64 bits

PowerShell:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117

EDIT1:

Pour être 100% compréhensible, laissez-moi reformuler:

  1. J'exécute PowerShell en tant qu'utilisateur
  2. J'exécute la fonction susmentionnée system-check
  3. Je veux que la fonction augmente pour pouvoir exécuter la commande; notez que je veux que l'invite UAC apparaisse
LinuxSecurityFreak
la source
Notez que de nombreuses commandes PowerShell intégrées et les commandes ajoutées par les modules Microsoft (telles que les commandes MSOL) nécessitent souvent une élévation mais ne fournissent en aucun cas une assistance pour l'élévation des privilèges. Ils échouent simplement avec des messages d'erreur cryptiques. Si vous créez une invite d'élévation dans vos scripts, vous offrirez plus de convivialité que Microsoft eux-mêmes.
Todd Wilcox

Réponses:

33

Pour exécuter une commande spécifique à partir d'une fenêtre élevée:

Start-Process -FilePath powershell.exe -ArgumentList {$ScriptBlock} -verb RunAs

Par exemple:

Start-Process -FilePath powershell.exe -ArgumentList {
    SFC /scannow
} -verb RunAs

Pour exécuter un script spécifique à partir d'une fenêtre élevée:

Start-Process powershell -ArgumentList '-noprofile -file MyScript.ps1' -verb RunAs

Pour exécuter une session PowerShell entière demandant l'UAC:

Start-Process powershell.exe -Verb runAs

Une fonction pour retourner $ True ou $ False si la fenêtre en cours s'exécute avec des autorisations élevées:

function isadmin
 {
 #Returns true/false
   ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
 }

Pour vous assurer qu'un script n'est exécuté qu'en tant qu'administrateur, ajoutez ceci au début:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
 {
  Echo "This script needs to be run As Admin"
  Break
 }

Dans PowerShell v4.0, ce qui précède peut être simplifié en utilisant une instruction #Requires:

#Requires -RunAsAdministrator

Source: exécuter avec des autorisations élevées

Ashton
la source