426 Stimmen

Ausführen eines Befehls als Administrator mit PowerShell?

Wenn Sie der administrative Benutzer eines Systems sind, können Sie mit der rechten Maustaste auf ein Batch-Skript klicken und es als Administrator ausführen, ohne das Administratorkennwort eingeben zu müssen.

Ich frage mich, wie ich dies mit einem PowerShell-Skript erreichen kann. Ich möchte mein Kennwort nicht eingeben müssen; ich möchte nur den Rechtsklick nachahmen Als Administrator ausführen Methode.

Nach allem, was ich bisher gelesen habe, müssen Sie das Administratorkennwort angeben.

5 Stimmen

Pruebe gsudo . Ein kostenloses Open-Source-Sudo für Windows, das die Ausführung als Administrator über die Befehlszeile ermöglicht. Es erscheint ein UAC-Pop-up.

457voto

Shay Levy Punkte 113401

Wenn die aktuelle Konsole nicht erhöht ist und der Vorgang, den Sie durchführen wollen, erhöhte Rechte erfordert, können Sie powershell mit dem Als Administrator ausführen Option :

PS> Start-Process powershell -Verb runAs

Microsoft Docs: Start-Vorgang

166voto

pgk Punkte 1905

Hier ist eine Ergänzung zu Shay Levis Vorschlag (fügen Sie diese Zeilen einfach am Anfang eines Skripts ein):

if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

Dies führt dazu, dass das aktuelle Skript an einen neuen Powershell-Prozess im Administratormodus übergeben wird (wenn der aktuelle Benutzer Zugriff auf den Administratormodus hat und das Skript nicht als Administrator gestartet wird).

142voto

Jayowend Punkte 1654

PowerShell-Skript zur Selbsterhöhung

Windows 8.1 / PowerShell 4.0 +

Eine Zeile :)

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

# Your script here

58voto

Andrew Odri Punkte 7660

Benjamin Armstrong veröffentlichte eine hervorragender Artikel über sich selbst aufbauende PowerShell-Skripte . Es gibt ein paar kleinere Probleme mit seinem Code; eine geänderte Version, die auf den in dem Kommentar vorgeschlagenen Korrekturen basiert, finden Sie unten.

Grundsätzlich wird die mit dem aktuellen Prozess verknüpfte Identität abgerufen, geprüft, ob es sich um einen Administrator handelt, und wenn nicht, wird ein neuer PowerShell-Prozess mit Administratorrechten erstellt und der alte Prozess beendet.

# Get the ID and security principal of the current user account
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID);

# Get the security principal for the administrator role
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator;

# Check to see if we are currently running as an administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
    # We are running as an administrator, so change the title and background colour to indicate this
    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)";
    $Host.UI.RawUI.BackgroundColor = "DarkBlue";
    Clear-Host;
}
else {
    # We are not running as an administrator, so relaunch as administrator

    # Create a new process object that starts PowerShell
    $newProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell";

    # Specify the current script path and name as a parameter with added scope and support for scripts with spaces in it's path
    $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"

    # Indicate that the process should be elevated
    $newProcess.Verb = "runas";

    # Start the new process
    [System.Diagnostics.Process]::Start($newProcess);

    # Exit from the current, unelevated, process
    Exit;
}

# Run your code that needs to be elevated here...

Write-Host -NoNewLine "Press any key to continue...";
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");

53voto

Venryx Punkte 11874

Hier ist ein selbsterklärendes Snippet für Powershell-Skripte die das Arbeitsverzeichnis beibehält :

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
    exit;
}

# Your script here

Die Beibehaltung des Arbeitsverzeichnisses ist wichtig für Skripte, die pfadrelative Operationen durchführen. Bei fast allen anderen Antworten wird dieser Pfad nicht beibehalten, was zu unerwarteten Fehlern im Rest des Skripts führen kann.

Wenn Sie lieber kein sich selbst auslösendes Skript/Snippet verwenden möchten und stattdessen nur eine einfache Möglichkeit suchen, ein Skript als Administrator zu starten (z.B. über das Explorer-Kontextmenü), lesen Sie meine andere Antwort hier: https://stackoverflow.com/a/57033941/2441655

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X