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.

Entwicklung von Chris
quelle

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.

Matt Hamilton
quelle
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.
Nadeem_MK
quelle
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.

Naveen
quelle
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%
Michael Potter
quelle
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.
user3335140
quelle
5

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

.\scriptname.ps1
Leon Bambrick
quelle
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.

ExchangeAdmin
quelle
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

user2781940
quelle