Wenn Benutzer unter Windows 7 mit der Windows-PowerShell experimentieren wollen, müssen Sie feststellen, dass die Skriptausführung verweigert wird. Auch mir fiel die Kinnlade herunter, als Windows 7 die Ausführung meines ersten PS1-Skripts verweigert und darauf hin wies, dass diese Funktion deaktiviert sei. Also habe ich recherchiert und eine Lösung gefunden, die nicht nur für Windows 7, sondern auch für Windows 8/8.1 verwendbar ist.
Anzeige
Komischerweise findet sich im Web da nix – die erste Fassung dieses Blogbeitrags wurde recht fix von Google ganz vorne in den Trefferlisten aufgeführt. Entweder habe ich etwas ganz gravierendes übersehen, und jedem anderen Anwender ist das Verhalten klar. Oder in Windows 7 wurden die Ausführungsrichtlinien für PowerShell-Skripte gegenüber früheren Fassungen der PowerShell (erstmals auf Set-ExecutionPolicy Restricted) geändert.
Hintergrund der Geschichte
Als ich zum ersten Mal ein PowerShell-Skript ausführen wollte, verweigert Windows die Ausführung von .ps1-Skriptdateien (z. B. über den Kontextmenübefehl Mit PowerShell ausführen). Auch in der PowerShell IDE-Entwicklungsumgebung erschien eine in roter Schrift gestaltete Fehlermeldung beim Ausführen eines .ps1-Skriptprogramms. Die Meldung enthielt den Hinweis, dass die Datei nicht geladen werden konnte, weil die Skriptausführung auf dem System deaktiviert sei. Ein paar PowerShell-Bücher, die ich auf die Schnelle konsultierte, lieferten da keinerlei Hinweise. Aber mit etwas Suchen in den PowerShell-Befehlen bzw. mittels der Hilfe der PowerShell konnte ich aber recht schnell eine Lösung für das Problem finden.
PowerShell-Skriptausführung generell freigeben
Anzeige
Um Skriptdateien der PowerShell ausführen zu können, müssen Sie deren Ausführung zulassen. Öffnen Sie das Eingabefenster der Windows PowerShell über den Kontextmenübefehl Als Administrator ausführen und tippen Sie dann den Befehl
Set-ExecutionPolicy Unrestricted
ein. Anschließend betätigen Sie die Nachfrage über die (J)-Taste. Der Ansatz ist zwar eine Art Holzhammer-Methode, um die Skriptausführung vollständig frei zu geben. Aber zum Ausprobieren auf einem lokalen System durchaus zu gebrauchen (gibt halt schnelle Resultate).
So wird die Skriptausführung nur eingeschränkt
Sie können auch (siehe Abschnitt Powershell signieren und Execution Policy) auch den Befehl:
Set-ExecutionPolicy Allsigned RemoteSigned
verwenden. Mit dieser höheren Sicherheitsstufe (gegenüber "Unrestricted") wird eine Ausführung lokaler PS1-Skripte (die von einem vertrauenswürdigen Autor erstellt wurden) ermöglicht. Die Skriptdateien brauchen also nicht signiert zu sein. Nur wenn Skriptdateien aus dem Internet heruntergeladen werden und für die entsprechende Sicherheitszone klassifiziert sind, wird die Skriptausführung verweigert.
Anmerkung: Mit dem Modus "RemoteSigned" habe ich mich hier ziemlich ins Knie geschossen. In meiner Testumgebung funktionierten lokale PowerShell-Skriptprogramme zuerst nicht. Die PowerShell ISE brach die Ausführung der Skriptbeispiele mit dem Hinweis ab, dass das Skript nicht signiert sei. Dies war für mich auf den ersten Blick in keinster Weise erklärbar, hatte ich die Beispieldateien für meine Magnum-Tricks-Bücher doch ein paar Wochen vorher im Editor der PowerShell ISE erstellt und dann lokal gespeichert.
Erst als ich auf die Idee kam, die Skriptdatei mit der rechten Maustaste anzuklicken, den Kontextmenübefehl Eigenschaften zu wählen und dann auf der Registerkarte Allgemein die Schaltfläche Zulassen anzuklicken, klappte die Skriptausführung. Also war bei den .ps1-Dateien in meinem Beispielordner die Kennung für die Internetzone gesetzt. Im Nachhinein habe ich eine Erklärung gefunden: Ich hatte die Skripte auf einem anderen Rechner entwickelt und bin später auf eine neue Maschine umgezogen. Durch das Kopieren der Dateien über das Netzwerk wurde natürlich die Zonenkennung von lokaler Maschine auf Internetzone umgesetzt. Also hat die Sicherheitseinstellung ihren Dienst getan.
In weiteren Versuchen habe ich dann noch herausgefunden, dass auch die Aktualisierung der Sicherheitskennung zwischen Windows-Shell und PowerShell ISE nicht so optimal läuft. Wurde die Kennung für die Internetzone über die Schaltfläche Zulassen angeklickt, ließ sich die Skriptdatei zwar über den Kontextmenübefehl Mit PowerShell ausführen starten. Aber die Ausführung in der PowerShell ISE klappte erst, nachdem ich die ISE beendet, neu gestartet und dann die PS1-Datei erneut geladen hatte. Alles ziemlich verzwickt.
Wenn's ganz sicher sein soll
Wer es ganz sicher haben will (z. B. in Serverumgebungen), kann die ExecutionPolicy über den Befehl:
Set-ExecutionPolicy RemoteSigned Allsigned
auf AllSigned setzen. Dann sind nur PS1-Dateien ausführbar, die digital signiert sind.
Wer sich mit Sicherheitsfragen in Verbindung mit der Skriptausführung unter PowerShell befassen möchte, sei auf die unter Links genannten Fundstellen [2] und [3] verwiesen. Unter [5, 6, 7] finden Sie Artikel, die das Signieren von PowerShell-Code beschreiben.
Falls der Zugriff auf die Registrierung scheitert
In den Microsoft Windows 7-Foren gibt es Anwender [4], bei denen der Zugriff auf den Registrierungsschlüssel mit der Richtlinie mit einer Fehlermeldung
Set-ExecutionPolicy : Access to the registry key
'HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'
is denied.
abbricht. In diesem Fall fehlt der betreffende Registrierungseintrag. Öffnen Sie die Registrierung im Registrierungseditor und navigieren Sie zum Schlüssel:
HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
Anschließend fügen Sie den Wert (REG_SZ) mit dem Namen ExecutionPolicy ein und setzen diesen auf "RemoteSigned". Dies erfordert administrative Berechtigungen. Danach lässt sich in der PowerShell Konsole mit Get-ExecutionPolicy prüfen, ob es geklappt hat.
Links:
[1] Windows 7-Bücher
[2] Windows PowerShell – abwehren von schädlichem Code
(älterer Artikel zu Monad)
[3] Introduction to Code Signing
[4] Microsoft Windows 7-Forum
[5] Signing PowerShell Scripts
[6] Signing PowerShell Scripts – Automatically
[7] Technet-Artikel zum Script-Signing
[8] Technet-Artikel zum Cmdlet "Set-ExecutionPolicy"
Weitere Infos zu Windows 7 finden sich in meinen Windows 7-Tricks-Titeln.
Anzeige
Wenn die Fehlermeldung "Set-ExecutionPolicy : Access to the registry key
'HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'
is denied." erscheint, hat man halt nicht die ausreichenden Rechte.
Dann einfach die Powershell als Administrator (rechtsklick -> Als Administrator ausführen) starten und nochmal versuchen.
Du hast in der Erklärung "RemoteSigned" und "AllSigned" vertauscht.
Wie die Namen schon sagen:
remote signed = rechnerferne signiert = Skripte, die übers Netzwerk aufgerufen werden, müssen signiert sein.
all signed = alle signiert = *alle* Skripte, auch lokale, müssen signiert sein.
@abc: Hast Recht! Ist nun korrigiert.
Kann man Powershell so konfigurieren, dass für Standardbenutzer auf der Powershell-Console keine Befehle ausgeführt werden dürfen, aber Skripte ausgeführt werden dürfen, wenn sie signiert sind?
@Thilo: Ich kann dir ad hoc keine Antwort liefern, da ich so gut wie nix mehr mit PS mache. Einziger Ansatz, den ich mir vorstellen könnte: Die PowerShell-Konsole über Gruppenrichtlinien in der Ausführung für Standardbenutzer blockieren. Welche Implikationen dies hat, kann ich nicht beurteilen.
Ein besonderer Dank für diesen informativen Beitrag.
Danke für den Tipp. Sehr, sehr hilfreich!
Super! Made my Day. Hätte ohne den Eintrag noch Stunden damit verbracht zu Suchen, warum das nochmals lokal abgespeicherte Skript nicht läuft. Die Anmerkung zu "Eigenschaften->Allgemein->Zulassen" waren Gold wert.
1000 Dank!
Sehr geehrter Herr Born,ich möchte ihn kurz beschreiben was ich für ein Problem mit der "gpedit.msc"einstellung habe.
ich möchte über die "Lokalen Sicherheitsrichtlinien"die Sicherheitsüberwachung einstellen und dan über ein Neustert aktivieren, aber wenn ich das dan überprüfe steht immer wieder "keine überwachung "Wo muß ich nun welche Richtlinie deaktivieren das meine einstellung erhalten bleiben tut.
Sicherheitsrichtlinien konfigurieren-auf"aktiviert"mit die beiden kästchen ein hägchen "Wärend regelmäßiger Hintergrundverarbeitung nicht übernehmen"und "Gruppenrichtlinienobjekte auch ohne veränderung verarbeiten"
Und dann habe ich unter "Überwachung:Unterkategorieinstellung der Überwachungsrichtlinie erzwingen(Windows Vista und höher),um kategorieinstellung der Überwachungsrichtlinie außer Kraft zu setzen"ist auf Aktiviert gestellt.Und dan habe ich unter "ErweiterteÜberwachungsrichtlinienkonfiguratin-Systemüberwachungsrichtlinien-Lokale Gruppenrichtlinienobjekt"habe ich alles von "kontoanmeldung"-Globale Objektzugriffsüberwachung"alles konfiguriert und das bleibt auch so wie ich es eingestellt habe.
würde mich freuen wenn sie antworten so das ich das problem lösen kann.es grüßt claus
So ganz habe ich nicht verstanden, was Du machen willst – ich tippe, es geht um das, was im Artikel hier beschrieben ist. Dort finden sich die benötigten Infos – ansonsten sind GPOs nicht so meine Baustelle.
Beim Versuch, einen Druckerport in einem Heimnetzwerk unter Windows 10 einzurichten: "cscript prnport.vbs -a -r IP_192.168.2.102 -h 192.168.2.102 – o raw – n 9100" findet die Powershell das Script nicht: "nicht vorhanden". Im Explorer ist es aber an der richtigen Stelle zu finden. Was mache ich falsch? Die geschilderte Holzhammer-Methode habe ich angewandt, hat aber nichts geändert.
Ich versuche unter Configuration Manager 1906 signierte PowerShell Skripte als Anwendung auszuführen. Wenn die GPO unsignierte PowerShell Skripte zulässt, funktioniert die Ausführung einwandfrei. Wenn jedoch die GPO signierte PowerShell Skripte erwartet, schlägt die Ausführung des Skripts fehl. Startet man das Skript manuell aus dem ccmcache mit dem in der Anwendung hinterlegten Aufruf
PowerShell.exe -ExecutionPolicy Bypass .\Skript.ps1
so folgt die Sicherheitsabfrage "Möchten Sie Software dieses nicht vertrauenswürdigen Herausgebers ausführen?" mit der Nachfrage nach den gewünschten Ausführungsoptionen. Vermutlich scheitert die Installation der Anwendung via Softwarecenter genau an dieser Sicherheitsabfrage.
Wie kann man diese Sicherheitsabfrage unterbinden? Ein dem PowerShell Command vorangestelltes "echo a & " was in der Eingabeaufforderung funktioniert, führt bei Ausführung aus dem Softwarecenter zu einem Fehler: "Zurzeit kann die Software auf keinem Server gefunden werden."
Ideen?