Wie aktiviere ich die Ausführung von PowerShell-Skripten?

260

Wenn ich versuche, mein PowerShell-Skript auszuführen, wird folgende Fehlermeldung angezeigt:

Die Datei C: \ Common \ Scripts \ hello.ps1 kann nicht geladen werden, da die Ausführung von Skripten auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "get-help about_signing".
In Zeile: 1
Zeichen : 13 +. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Pavel Chuchuva
quelle

Antworten:

399
  1. Starten Sie Windows PowerShell mit der Option "Als Administrator ausführen". Nur Mitglieder der Administratorgruppe auf dem Computer können die Ausführungsrichtlinie ändern.

  2. Aktivieren Sie die Ausführung von nicht signierten Skripten, indem Sie Folgendes eingeben:

    set-executionpolicy remotesigned
    

Auf diese Weise können Sie nicht signierte Skripts, die Sie auf Ihrem lokalen Computer schreiben, und signierte Skripts aus dem Internet ausführen.

Siehe auch Ausführen von Skripten in der Microsoft TechNet-Bibliothek.

Pavel Chuchuva
quelle
3
Wird dadurch die Richtlinie dauerhaft geändert oder muss ich dies bei jedem Neustart des Computers tun?
Ray
1
@Ray Hiermit wird die Richtlinie dauerhaft geändert.
Pavel Chuchuva
1
@ Ray Siehe Dokumentation . Standardmäßig wird es für die festgelegt LocalMachine. Um für andere Bereiche ( CurrentUseroder Process) festzulegen , übergeben Sie -Scopeexplizit.
jpmc26
@PavelChuchuva sollte ich diese Zeile zu meinem Skript hinzufügen, das Sie meinten
FabioSpaghetti
@FabioSpaghetti Sie müssen nichts zu Ihren Skripten hinzufügen. Führen Sie diesen Befehl einfach einmal aus, indem Sie die folgenden Schritte ausführen.
Pavel Chuchuva
74

Die Standardausführungsrichtlinie ist auf "Eingeschränkt" eingestellt. Sie können sie anzeigen, indem Sie Folgendes eingeben:

Get-ExecutionPolicy

Sie sollten Folgendes eingeben, um in den uneingeschränkten Modus zu wechseln:

Set-ExecutionPolicy unrestricted

Hoffe das hilft

William Hilsum
quelle
13
Die erforderliche Signatur ist sinnvoll, wenn Sie erwarten, dass der Benutzer bösartige Skripts aus dem Internet kopiert und einfügt. Wenn Sie davon ausgehen, dass der Benutzer nicht dumm ist, bietet "remotesigned" keine zusätzliche Sicherheit und erschwert das Leben.
Guss
@Guss: Beim Testen stellte ich fest, dass für RemoteSigned keine lokal generierten .ps1-Dateien mehr signiert werden müssen und die Git-Quellcodeverwaltung als lokale Quelle behandelt wird.
Joshua
@Joshua - ja, genau mein Punkt. Wenn RemoteSignedCopy & Paste nicht blockiert, Git oder andere nicht-IE-Download-Methoden nicht blockiert, wofür ist es dann gut? Sag es mit mir: "absolut nichts!". Ich denke, es ist nutzlos, Skripte mit einem 100-Dollar-Codesignaturzertifikat signieren zu müssen, und es negiert alles Gute, das eine anständige Skriptsprache für Windows leisten kann. Davon abgesehen, wenn der richtige Weg ist , Benutzer zu bekommen , um zu verstehen , was sie damit tun PS - Skripte verwenden, dann können wir auch sth ... Nahhhh, das wird nie funktionieren ;-)
Guss
@Guss: Ich habe bereits eine gute Skriptsprache unter Windows. Cygwin funktioniert hervorragend unter Windows 10; wie buchstäblich so viel besser als es auf jeder früheren Version von Windows gewesen ist. Ich möchte immer nur Skripte ausführen, die bereits von jemand anderem geschrieben wurden.
Joshua
61

Auf meinem Computer, den ich zum Entwickeln von Skripten verwende, verwende ich -unrestricted wie oben. Wenn ich meine Skripte jedoch auf einem Endbenutzercomputer bereitstelle, rufe ich nur Powershell mit der Option -executionpolicy auf:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
MDMoore313
quelle
2
Möglicherweise möchten Sie diesen Trick mit einem mehrsprachigen Trick in einer CMD-Datei kombinieren. Siehe stackoverflow.com/a/8597794/5314
Jay Bazuzi,
Nett! Ich habe sfxs bereitgestellt, die von winrar rarlabs.com
MDMoore313 am
1
Mit diesem Trick konnte ich ein Powershell-Skript von Git Bash (MINGW32-Bash)
Kamil Szot,
16

Mit dem folgenden Befehl können wir den Status der aktuellen ExecutionPolicy abrufen:

Get-ExecutionPolicy;

Standardmäßig ist es eingeschränkt . Um die Ausführung von PowerShell-Skripten zu ermöglichen, müssen Sie ExecutionPolicy auf Bypass oder Unrestricted setzen .

Wir können die Richtlinie für den aktuellen Benutzer als Bypassoder Unrestrictedmithilfe eines der folgenden PowerShell-Befehle festlegen :

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

Durch eine uneingeschränkte Richtlinie werden alle Konfigurationsdateien geladen und alle Skripts ausgeführt. Wenn Sie ein nicht signiertes Skript ausführen, das aus dem Internet heruntergeladen wurde, werden Sie vor der Ausführung zur Erlaubnis aufgefordert.

Während in der Umgehungsrichtlinie nichts blockiert ist und während der Skriptausführung keine Warnungen oder Eingabeaufforderungen angezeigt werden. Bypass ExecutionPolicy ist entspannter als Uneingeschränkt.

Pratik Patil
quelle
5

Abhängig von der Windows-Version und -Konfiguration wird möglicherweise auch im UnrestrictedModus die folgende Warnung angezeigt :

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

Die Lösung besteht darin, die "Bypass" -Richtlinie zu verwenden, die mit dem folgenden Befehl aktiviert wird:

Set-ExecutionPolicy Bypass

Aus der Dokumentation :

Bypass: Nichts ist blockiert und es gibt keine Warnungen oder Eingabeaufforderungen.

Dies ist offensichtlich unsicher, bitte verstehen Sie die damit verbundenen Risiken.

Benoit Blanchon
quelle
Nur so konnte ich mein Skript in einer WINE-Umgebung mit Powershell 2.0 ausführen lassen. Danke.
Wyatt8740
@ Wyatt8740: Weil Wine alle Laufwerke als Netzlaufwerke präsentiert.
Joshua
@ Joshua Ich hatte keine Ahnung. Kannst du mir eine Quelle für diese Aussage geben? Ich habe ein gelegentliches Google ausprobiert, aber ich sehe offensichtlich falsch aus.
Wyatt8740
@ Wyatt8740: Quelle: allgemeines Dialogfeld Wine OpenFileName. Schauen Sie sich die Laufwerkssymbole an.
Joshua
@Joshua Ich meinte eine Quellcode-Quelle; Symbole sind möglicherweise beliebig. Aber daran hatte ich nicht gedacht. Ich denke, das ist ein guter Anfang (Bearbeiten:
Sieht
2

Ein
Registrierungsschlüssel mit: Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "Bypass"

und:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

funktioniert ja auch.

Giesbert Schipper
quelle
1

Aus irgendeinem Grund hat das PowerShell-Cmdlet die globale lokale Ausführung nur für den lokalen Benutzerkontext nicht aktiviert. Wenn ich zum Beispiel versuchen würde, ein Powershell-Skript über die Bash-Eingabeaufforderung von CygWin zu starten, das unter einem eigenen Benutzerkontext ausgeführt wird, würde es nicht ausgeführt, was den Fehler "Nicht digital signiert" zur Folge hätte. Die Antwort war, in den Editor für lokale Gruppenrichtlinien -> Richtlinie für lokalen Computer -> Administrative Vorlagen -> Windows-Komponenten -> Windows PowerShell zu wechseln und auf "Skriptausführung aktivieren" zu doppelklicken. Dadurch kann ich es in "Aktiviert" ändern und dann die Richtlinie "Lokale Skripte und remote signierte Skripte zulassen" ausführen und unabhängig vom Benutzerkontext global ausführen.

Eric Green
quelle
0

Die akzeptierte Antwort ist richtig, aber die Richtlinienänderung ist nur für die aktuell ausgeführte Instanz von Powershell verfügbar, dh sobald die Instanz von Powershell heruntergefahren wurde. Die Richtlinie wird zurückgesetzt. Wenn ein Benutzer eine andere Instanz von Powershell erneut öffnet, wird die Standardrichtlinie angewendetRestricted

Für mich muss ich die VisualStudio Code-Konsole und g ++ von Cygwin verwenden, um Dinge zu erstellen. Die Konsole verwendet Powershell. Mit der Standardrichtlinie kann nichts getan werden. Eine Lösung besteht darin, die Richtlinie jedes Mal zu ändern, wenn die Konsole in der VisualStudio Code-Konsole ausgelöst wird. Möglicherweise handelt es sich dabei um ein Skript zum Ändern der Richtlinie.

Ich bin faul, also ist eine andere Lösung, wenn ich die PowerShell im Admin-Modus ausführe, ähnlich wie die akzeptierte Antwort. aber mit einem zusätzlichen Parameter, der die Werte in der Registrierungstabelle ändert. Sobald es fertig ist. Andere Instanzen von Powershell verwenden die RemoteSignedRichtlinie standardmäßig.

set-executionpolicy remotesigned -Scope CurrentUser

r0ng
quelle
0

Das (richtige) Festlegen der Richtlinie ist die beste Wahl, aber auf meinen verwalteten Systemen kann ich diese Richtlinie nicht ändern.

Für mich besteht die einfachste Lösung zum Ändern der Richtlinie darin, das Skript in der "PowerShell ISE" zu öffnen, den auszuführenden Code (oder einen Teil des Codes) zu markieren und dann auf die Schaltfläche "Auswahl ausführen" zu klicken (oder die Taste F8 zu verwenden) Abkürzung).

Dies ist nicht die beste Lösung und macht wenig für die Automatisierung von Aufgaben, aber es ermöglicht mir die Verwendung und das Nutzen von PowerShell, während ich nicht mit meiner IS-Abteilung in Konflikt stehe.

DBADon
quelle
-2

Der Grund, warum die Reg-Taste funktioniert, ist, dass sie genau das tut, was die PS-Befehle tun. Die Befehle schreiben die Änderungen in die Registertasten. Befehle sind viel schneller und einfacher als das Erstellen eines Registrierungsschlüssels oder das Eingraben in die Registrierung.

Keith
quelle
1
Das ist einfach falsch: Die Schlüssel, die in anderen Antworten erwähnt wurden, ändern die Powershell-Ausführungsrichtlinie, wodurch das Powershell-Skript ausgeführt werden kann.
Patrick R.