PowerShell: Skript als Administrator ausführen
Inhaltsverzeichnis:
- Verwenden des Cmdlet
Start-Process
zum Ausführen des PowerShell-Skripts als Administrator - PowerShell-Skript mit Argumenten als Administrator ausführen
- Ausführen des PowerShell-Skripts als Administrator unter Beibehaltung des Arbeitsverzeichnisses
Die meisten Skripts, die wir schreiben und ausführen, erfordern Berechtigungen, was dazu führt, dass ein Administrator die Skripts über eine PowerShell-Eingabeaufforderung mit erhöhten Rechten ausführt. In PowerShell erhöhen wir unsere Berechtigungen, indem wir Windows PowerShell mit Administratorrechten ausführen und unsere Administratoranmeldeinformationen eingeben.
Möglicherweise müssen wir unsere Skripte jedoch für bestimmte Situationen nahtlos ausführen, ohne Administratoranmeldeinformationen einzugeben.
Daher können wir verschiedene selbsterhöhende Befehle am Anfang unserer Skripte integrieren, und wir zeigen Ihnen in diesem Artikel, wie.
Verwenden des Cmdlet Start-Process
zum Ausführen des PowerShell-Skripts als Administrator
Das Cmdlet Start-Process
initiiert einen oder mehrere Prozesse, ausführbare oder Skriptdateien oder beliebige Dateien, die eine installierte Software auf dem lokalen Computer öffnen kann, einschließlich Windows PowerShell.
Mit diesem Cmdlet und einer Reihe von Parametern können wir Windows PowerShell als Administrator ausführen.
Für dieses Beispiel haben wir ein Hello_World.ps1-Skript erstellt, das eine einfache Hello World
-Zeichenfolge in unserer Konsole ausgibt.
Hello_World.ps1
:
Write-Output 'Hello World!'
Wir können die obige PowerShell-Datei als Beispiel verwenden, um zu überprüfen und zu verifizieren, ob wir unsere Skripte mit Administratorrechten ausführen. Führen Sie zunächst den folgenden Snippet-Code aus.
Hinweis: Aufgrund der Benutzerkontensteuerung (UAC) Ihres lokalen Computers muss Windows PowerShell möglicherweise noch nach Ihrer Bestätigung fragen. Wir empfehlen, UAC aus Sicherheitsgründen nicht vollständig zu deaktivieren.
Start-Process powershell -verb RunAs -ArgumentList ".\Hello_World.ps1"
Beim Ausführen des obigen Skripts wird eine neue Instanz von Windows PowerShell mit Administratorrechten erstellt. Der einzige Vorbehalt für das oben ausgeführte Skript besteht darin, dass wir, wenn wir Argumente an unsere PowerShell-Datei übergeben müssen, die Argumente nicht an die neu erstellte Verwaltungskonsole übertragen.
PowerShell-Skript mit Argumenten als Administrator ausführen
Dieses Beispiel kann unser vorheriges Einzeiler-Skript nehmen und es innerhalb mehrerer bedingter Anweisungen überarbeiten.
# 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!'
Bisher haben wir unser PowerShell-Skript ausgeführt, indem wir eine separate Datei aufgerufen haben,
aber wir können unser Skript (z. B. Hello_World.ps1
) für dieses Beispiel einfach unter diesem Snippet platzieren.
So funktioniert das Snippet.
- Die erste
if
-Anweisung prüft, ob das ausgeführte Skript bereits in Windows PowerShell mit Administratorrechten ausgeführt wird. - Die zweite
if
-Anweisung prüft, ob die Build-Nummer des Windows-Betriebssystems 6000 oder höher ist.
(Windows Vista oder Windows Server 2008 oder höher) - Die Variable
$Command
ruft und speichert den Befehl, der zum Ausführen des Skripts verwendet wird, einschließlich Argumente. - Der
Start-Process
startet eine neue Instanz von Windows PowerShell mit erhöhten Rechten und
führt das Skript erneut aus, genau wie unser vorheriges Skript.
Ausführen des PowerShell-Skripts als Administrator unter Beibehaltung des Arbeitsverzeichnisses
Möglicherweise müssen wir das Arbeitsverzeichnis des Skripts für bestimmte Situationen beibehalten.
Also, hier ist ein sich selbst erhebendes Snippet, das das Arbeitsverzeichnis verwaltet:
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!'
In diesem Snippet haben wir $PSCommandPath
als eines der Argumente innerhalb des Cmdlets Start-Process
übergeben, um das Arbeitsverzeichnis beizubehalten, in dem das Skript ausgeführt wurde.
Das Beibehalten des Arbeitsverzeichnisses ist für die Durchführung pfadbezogener Operationen von entscheidender Bedeutung. Leider behalten die vorherigen paar Snippets, die wir zuvor gezeigt haben, ihren Pfad nicht bei, was zu unerwarteten Fehlern führen kann. Daher können Sie die obige überarbeitete Syntax verwenden.