Warum werden meine PowerShell-Skripts nicht ausgeführt?


103

Ich habe eine einfache Batchdatei als PowerShell-Skript geschrieben und erhalte beim Ausführen Fehler.

Es befindet sich in einem Skriptverzeichnis in meinem Pfad. Dies ist der Fehler, den ich bekomme:

Kann nicht geladen werden, da die Ausführung von Skripten auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "Hilfe zum Signieren".

Ich habe in der Hilfe nachgesehen, aber es ist weniger als hilfreich.

Antworten:


102

Dies kann die Standardsicherheitsstufe von PowerShell sein, bei der (IIRC) nur signierte Skripts ausgeführt werden.

Versuchen Sie Folgendes einzugeben:

set-executionpolicy remotesigned

Dadurch wird PowerShell angewiesen, lokale (dh auf einem lokalen Laufwerk) nicht signierte Skripts auszuführen.

Versuchen Sie dann erneut, Ihr Skript auszuführen.


5
Sie müssen Powershell mit Administratorrechten ausführen, zumindest unter Windows 8!
ComFreek

1
Außerdem müssen Sie das PowerShell-Skript mit Administratorrechten auch unter Windows 7 ausführen.
Rod

14
Dies ist eine ziemlich erschreckende Antwort. Zum einen wird die Standardsicherheitsstufe von Powershell dauerhaft auf möglicherweise unerwünschte (und unsichere) Weise geändert. Zum anderen wird nicht einmal ausreichend erklärt, dass signierten Remote-Skripten und nicht signierten lokalen Skripten - aber nicht signierten Remote-Skripten, die Chocolatey gelegentlich benötigt - Ausführungsberechtigungen gewährt werden. Die meisten Benutzer möchten dies und das wahrscheinlich stattdessen.
Cecil Curry

1
Obwohl Cecils Besorgnis über einige Schwächen in der Antwort gerecht ist, wollte ich auf einige Dinge hinweisen. 1) Seine beiden Links scheinen für mich dieselbe Seite zu öffnen. 2) Wenn Sie möchten, dass Skripte einfach ausgeführt werden, ist das Festlegen der Ausführungsrichtlinie wahrscheinlich noch der richtige Weg und möglicherweise nicht mit OP verbunden: 3) Es scheint, dass die beste Richtlinie für Startskripte gilt. Geben Sie die Ausführungsrichtlinie und den Bereich in der Befehlszeile an Führen Sie das Skript aus, und stellen Sie für die Anmeldung die Sitzungskonfiguration nach Bedarf ein. Wenn Sie während der Windows-Sitzung eine hohe Sicherheit wünschen, die Anmeldung jedoch reduziert ist, sollten Sie Ihre Skriptreihenfolge differenzieren.
OmJohn8372

Für One-Shots finde ich die Antwort von Ankur unten , die eine vorübergehende Ausnahme für die laufende PowerShell-Instanz definiert, am hilfreichsten.
Florenz Kley

79

Sie müssen ausführen Set-ExecutionPolicy:

Set-ExecutionPolicy Restricted <-- Will not allow any powershell scripts to run.  Only individual commands may be run.

Set-ExecutionPolicy AllSigned <-- Will allow signed powershell scripts to run.

Set-ExecutionPolicy RemoteSigned <-- Allows unsigned local script and signed remote powershell scripts to run.

Set-ExecutionPolicy Unrestricted <-- Will allow unsigned powershell scripts to run.  Warns before running downloaded scripts.

Set-ExecutionPolicy Bypass <-- Nothing is blocked and there are no warnings or prompts.

3
Was ist der Standardwert für ExecutionPolicy, auf den Windows eine Neuinstallation festlegt?
Matthew Lock

5
@MatthewLock Restrictedist die Standardrichtlinie. Lesen Sie mehr
Nadeem_MK

24

Verwenden:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Verwenden Sie immer den obigen Befehl, um die Ausführung von PowerShell in der aktuellen Sitzung zu aktivieren.


Diese + superuser.com/questions/612409/... + shorcut link = Perfektion
Q20

16

Ich konnte diesen Fehler umgehen, indem ich PowerShell wie folgt aufrief:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

Das heißt, ich habe das -executionpolicy bypasszu der Art hinzugefügt , wie ich das Skript aufgerufen habe.

Dies funktionierte unter Windows 7 Service Pack 1. Ich bin neu in PowerShell, daher kann es zu Einschränkungen kommen, die mir nicht bekannt sind.

[Edit 2017-06-26] Ich habe diese Technik weiterhin ohne Probleme auf anderen Systemen einschließlich Windows 10 und Windows 2012 R2 verwendet.

Hier ist, was ich jetzt benutze. Dies verhindert, dass ich das Skript versehentlich ausführe, indem ich darauf klicke. Wenn ich es im Scheduler ausführe, füge ich ein Argument hinzu: "Scheduler", das die Eingabeaufforderung umgeht.

Dadurch wird auch das Fenster am Ende angehalten, damit ich die Ausgabe von PowerShell sehen kann.

if NOT "%1" == "scheduler" (
   @echo looks like you started the script by clicking on it.
   @echo press space to continue or control C to exit.
   pause
)

C:
cd \Scripts

powershell -executionpolicy bypass -File .\rundps.ps1

set psexitcode=%errorlevel%

if NOT "%1" == "scheduler" (
   @echo Powershell finished.  Press space to exit.
   pause
)

exit /b %psexitcode%

Dies ist, was Chocolatey verwendet, um Chocolatey herunterzuladen und zu installieren
icc97

Ich habe versucht, den Befehl Set-ExecutionPolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 auszuführen, und habe eine Fehlermeldung erhalten. Für diesen Befehl gibt es keine Option --Datei.
David Spector

Oh, ich verstehe. Sie müssen eine Verknüpfung erstellen, die den Befehl powershell -executionpolicy bypass -File C: \ Users \ david \ Desktop \ test.ps1 enthält. Der Befehl test.ps1 wird dann auch dann ausgeführt, wenn der sichere globale Befehl Set-ExecutionPolicy Restricted gegeben wurde. Ich hoffe, diese grundlegenden Informationen helfen jemandem.
David Spector

5
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Der obige Befehl hat bei mir auch dann funktioniert, wenn der folgende Fehler auftritt:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.

5

Es ist auch wichtig zu wissen, dass Sie möglicherweise .\vor dem Skriptnamen einfügen müssen. Beispielsweise:

.\scriptname.ps1

1

Mit dem Befehl set-executionpolicy unrestrictedkann jedes von Ihnen erstellte Skript als angemeldeter Benutzer ausgeführt werden. Stellen Sie einfach sicher, dass die Einstellung für die Ausführungsrichtlinie set-executionpolicy signedvor dem Abmelden mit dem Befehl auf signiert zurückgesetzt wird.


set-executionpolicy signedgibt Cannot bind parameter 'ExecutionPolicy'etc.
JinSnow

0

Unter Windows 10: Klicken Sie auf Sicherheitseigenschaft von myfile.ps1 ändern und ändern Sie "Zugriff zulassen", indem Sie mit der rechten Maustaste auf / Eigenschaften auf myfile.ps1 klicken

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.