PowerShell-Skripte lassen sich nicht ausführen

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.


Werbung


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

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.


Werbung



Dieser Beitrag wurde unter PowerShell, Problemlösung, Windows 7 abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

7 Antworten auf PowerShell-Skripte lassen sich nicht ausführen

  1. Daniel sagt:

    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.

  2. Pingback: PowerShell Community Extensions « IT-Notizblo{g|ck}

  3. abc sagt:

    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.

  4. ThL sagt:

    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?

    • Günter Born sagt:

      @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.

  5. Pingback: Powershell intro | Tutorials from tor.eu

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>