Je bent hier: ITFAQ.nl » Hoe kan ik? » Controleren of een PowerShell-script als administrator wordt uitgevoerd

Controleren of een PowerShell-script als administrator wordt uitgevoerd

Als Windows Server-beheerder log je natuurlijk in als gewone gebruiker zonder beheerdersrechten. Maar vaak moet je PowerShell-scripts uitvoeren als beheerder. Hoe zorg je er nou voor dat je een melding van PowerShell krijgt als je onverhoopt vergeet PowerShell als beheerder te starten?

Uitvoeren als beheerder afdwingen in PowerShell

Je kunt op meerdere manieren afdwingen dat een script als beheerder (administrator) uitgevoerd moet worden in PowerShell. Eén van de meest eenvoudige is om te controleren of de huidige gebruiker lid is van de ingebouwde beveiligingsrol Administrators.

Neem hiervoor bovenin je scripts het volgende op:

If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
  Write-Warning "Sorry, je hebt geen administrator rechten."
  Break
}

Is het script niet als beheerder gestart, dan zie je de waarschuwing en stopt het script, nog voordat er iets is uitgevoerd.

#Requires -RunAsAdministrator

Vanaf PowerShell 4.0 kun je ook #Requires met argument -RunAsAdministrator gebruiken. Omdat we allemaal minimaal PowerShell 5.1 gebruiken, of liever PowerShell 7, kun je dit opnemen in je scripts:

#Requires -RunAsAdministrator

Zet dit bovenaan je script, dan zie je meteen dat het script beheerdersrechten nodig heeft. Als je het script uitvoert zonder die rechten, krijg je direct een foutmelding dat je niet over de juiste privileges beschikt:

.\script.ps1: The script ‘script.ps1’ cannot be run because it contains a “#requires” statement for running as Administrator. The current PowerShell session is not running as Administrator. Start PowerShell by using the Run as Administrator option, and then try running the script again.

Helaas geeft #Requires -RunAsAdministrator je geen nette foutmelding of mogelijkheid om de foutmelding af te vangen.

Het script automatisch opnieuw starten als beheerder

Wil je niet alleen een melding, maar het script meteen opnieuw starten met beheerdersrechten? Combineer dan de controle van hierboven met Start-Process -Verb RunAs. Windows vraagt je dan via het UAC-venster (Gebruikersaccountbeheer) om toestemming:

If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
  Start-Process -FilePath (Get-Process -Id $PID).Path -Verb RunAs -ArgumentList "-NoProfile -File `"$PSCommandPath`""
  Exit
}

Met (Get-Process -Id $PID).Path start je dezelfde PowerShell-versie opnieuw: powershell.exe voor Windows PowerShell 5.1, of pwsh.exe voor PowerShell 7. $PSCommandPath is het volledige pad naar je script.

Conclusie

Wil je alleen voorkomen dat een script zonder beheerdersrechten draait, dan is #Requires -RunAsAdministrator de kortste oplossing. Wil je zelf bepalen welke melding je toont, of het script automatisch opnieuw starten als beheerder, gebruik dan de controle met IsInRole().

Scroll naar boven