PowerShell-Skripte lassen sich nicht ausführen

Es gibt immer wieder mal Benutzer, die mit der Windows-PowerShell experimentieren wollen, dann aber 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 dies deaktiviert sei.

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.

Als ich zum ersten Mal vor dem Problem stand, konnte ich mit etwas Suchen in den Befehlen bzw. der Hilfe der PowerShell aber recht schnell eine Lösung für das Problem finden.

Zitat: "Verweigert Windows die Ausführung von .ps1-Skriptdateien (z. B. über den Kontextmenübefehl Mit PowerShell ausführen)? Oder erhalten Sie in der Entwicklungsumgebung eine in roter Schrift gestaltete Fehlermeldung beim Ausführen eines .ps1-Skriptprogramms mit dem Hinweis, dass die Datei nicht geladen werden konnte, weil die Skriptausführung auf dem System deaktiviert sei? 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."

Quelle: Der Hinweis findet sich in meinen drei Windows 7-Magnum-Titeln

Der obige 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 RemoteSigned

verwenden. Mit dieser höheren Sicherheitsstufe (gegenüber “Unrestricted”) wird eine Ausführung lokaler PS1-Skripte ermöglicht – auch wenn diese unsigniert sind. 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 funktionierte dies zuerst nicht, d.h. die PowerShell ISE brach die Ausführung des Skripts mit dem gleichen Hinweis ab, dass das Skript nicht signiert sei. Dies war für mich in keinster Weise erklärbar, hatte ich die Beispieldatei für meine Magnum-Tricks-Bücher doch 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.


Werbung



Wer es ganz sicher haben will (z.B. in Serverumgebungen), kann die ExecutionPolicy über den Befehl:

Set-ExecutionPolicy AllSigned

auf AllSigned setzen. Dann sind aber nur PS1-Dateien ausführbar, die digital signiert sind. Eigentlich sollte bei unsignierten PS1-Dateien eine Nachfrage erscheinen, ob dieses Skript ausgeführt werden darf. Aber auf meinem System klappte das nicht. Ich habe das Verhalten dann nicht weiter untersucht. Da ich keine Lust habe, nur für ein paar Tests meine Skripte zu signieren oder mit den obigen Klippen zu experimentieren, fahre ich hier die ExecutionPolicy auf Unrestricted.

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.

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


Weitere Infos zu Windows 7 finden sich in meinen Windows 7-Tricks-Titeln.

(c) by Günter Born www.borncity.de
The source of smart computer books

Schlagworte: , ,

Kommentieren