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.

34voto

Rosberg Linhares Punkte 3061

Sie können eine Batch-Datei (*.bat) erstellen, die Ihr Powershell-Skript mit Administratorrechten ausführt, wenn Sie darauf doppelklicken. Auf diese Weise können Sie Sie müssen nichts in Ihrem Powershell-Skript ändern Erstellen Sie dazu eine Batch-Datei mit demselben Namen und Speicherort wie Ihr Powershell-Skript und fügen Sie den folgenden Inhalt ein:

@echo off

set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1

powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"%scriptFolderPath%`\"; & \`\".\%powershellScriptFileName%\`\"`\"\" -Verb RunAs"

Das war's!

Hier ist die Erklärung:

Angenommen, Ihr Powershell-Skript befindet sich im Pfad C:\Temp\ScriptTest.ps1 muss Ihre Batch-Datei den Pfad C:\Temp\ScriptTest.bat . Wenn jemand diese Batch-Datei ausführt, werden die folgenden Schritte ausgeführt:

  1. Der Befehl cmd führt den Befehl

    powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"C:\Temp\`\"; & \`\".\ScriptTest.ps1\`\"`\"\" -Verb RunAs"
  2. Eine neue Powershell-Sitzung wird geöffnet und der folgende Befehl wird ausgeführt:

    Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"C:\Temp\`"; & \`".\ScriptTest.ps1\`"`"" -Verb RunAs
  3. Eine weitere neue Powershell-Sitzung mit administrativen Rechten wird im System32 und die folgenden Argumente werden an ihn übergeben:

    -ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
  4. Der folgende Befehl wird mit administrativen Rechten ausgeführt:

    cd "C:\Temp"; & ".\ScriptTest.ps1"

    Sobald die Argumente für den Skriptpfad und -namen in Anführungszeichen stehen, können sie Leerzeichen oder einfache Anführungszeichen (') enthalten.

  5. Der aktuelle Ordner ändert sich von System32 zu C:\Temp und das Skript ScriptTest.ps1 ausgeführt werden. Sobald der Parameter -NoExit übergeben wurde, wird das Fenster nicht geschlossen, selbst wenn Ihr Powershell-Skript eine Ausnahme auslöst.

26voto

akauppi Punkte 15498

Verwendung von

#Requires -RunAsAdministrator

ist noch nicht festgelegt worden. Sie scheint erst seit PowerShell 4.0 vorhanden zu sein.

http://technet.microsoft.com/en-us/library/hh847765.aspx

Wenn dieser Switch-Parameter zu Ihrer requires-Anweisung hinzugefügt wird, gibt er an, dass die W Skript ausgeführt wird, mit erhöhten Benutzerrechten gestartet werden muss (Als Administrator ausführen).

Das scheint mir ein guter Weg zu sein, aber ich bin mir über die praktischen Erfahrungen noch nicht sicher. PowerShell 3.0-Laufzeiten ignorieren dies wahrscheinlich, oder noch schlimmer, geben einen Fehler.

Wenn das Skript als Nicht-Administrator ausgeführt wird, wird der folgende Fehler angezeigt:

Das Skript "StackOverflow.ps1" kann nicht ausgeführt werden, da es eine "#requires"-Anweisung für die Ausführung als Administrator enthält. Die aktuelle Windows PowerShell-Sitzung wird nicht als Administrator ausgeführt. Starten Sie . Windows PowerShell mit der Option "Als Administrator ausführen", und versuchen Sie dann versuchen Sie dann, das Skript erneut auszuführen.

+ CategoryInfo          : PermissionDenied: (StackOverflow.ps1:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ScriptRequiresElevation

16voto

manojlds Punkte 273771

Sie können einfach einige Registrierungseinträge hinzufügen, um ein "Als Administrator ausführen"-Kontextmenü zu erhalten für .ps1 Dateien:

New-Item -Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowershellScript.1\Shell\runas\command" `
-Force -Name '' -Value '"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"'

(aktualisiert durch ein einfacheres Skript von @Shay)

Grundsätzlich bei HKCR:\Microsoft.PowershellScript.1\Shell\runas\command setzen Sie den Standardwert, um das Skript mit Powershell aufzurufen.

14voto

John Punkte 963

Der von Jonathan und Shay Levy gepostete Code hat bei mir nicht funktioniert.

Nachstehend finden Sie den funktionierenden Code:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
#"No Administrative rights, it will display a popup window asking user for Admin rights"

$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"

11voto

Rython Punkte 547

Führen Sie das Skript erneut mit administrativen Rechten aus und prüfen Sie, ob es in diesem Modus gestartet wurde. Im Folgenden habe ich ein Skript geschrieben, das zwei Funktionen hat: DoElevatedOperations y DoStandardOperations . Sie sollten Ihren Code, der Administratorrechte erfordert, in den ersten und Standardoperationen in den zweiten platzieren. Die IsRunAsAdmin wird verwendet, um den Admin-Modus zu identifizieren.

Mein Code ist ein vereinfachter Auszug aus dem Microsoft-Skript, das automatisch generiert wird, wenn Sie ein Anwendungspaket für Windows Store-Anwendungen erstellen.

param(
    [switch]$IsRunAsAdmin = $false
)

# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path

#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges.  This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
    # Set up command line arguments to the elevated process
    $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'

    # Launch the process and wait for it to finish
    try
    {
        $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
    }
    catch
    {
        $Error[0] # Dump details about the last error
        exit 1
    }

    # Wait until the elevated process terminates
    while (!($AdminProcess.HasExited))
    {
        Start-Sleep -Seconds 2
    }
}

function DoElevatedOperations
{
    Write-Host "Do elevated operations"
}

function DoStandardOperations
{
    Write-Host "Do standard operations"

    LaunchElevated
}

#
# Main script entry point
#

if ($IsRunAsAdmin)
{
    DoElevatedOperations
}
else
{
    DoStandardOperations
}

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