Montag, Dezember 23, 2024
PowerShell

PowerShell: Skript als Administrator ausführen

Inhaltsverzeichnis:

  1. Verwenden des Cmdlet Start-Process zum Ausführen des PowerShell-Skripts als Administrator
  2. PowerShell-Skript mit Argumenten als Administrator ausführen
  3. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert