ExecutionPolicies

ExecutionPolicies

ExecutionPolicies oder Windows PowerShell-Ausführungsrichtlinien, steuern das Ausführen von Scripten auf lokalen Systemen und/oder in einem Firmennetzwerk über entsprechende GroupPolicy Einstellungen. Dabei handelt es sich nicht um ein Sicherheitssystem, die Richtlinien können problemlos umgangen werden, dies sollte bedacht werden. Zwischen folgenden Richtlinien wird unterschieden:

  • Restricted (Eingeschränkt) – Es können keine Scripte ausgeführt werden, dies ist die Standardrichtlinie. Die PowerShell kann nur einzelne Befehle ausführen alle Scriptdateien, einschließlich Formatierungs- und Konfigurationsdateien (.ps1xml), Modulskriptdateien (.psm1) und Windows PowerShell-Profilen (.ps1) werden nicht ausgeführt.
  • AllSigned (Vollständig signiert) – Nur von einem vertrauenswürdigen Autor erstellte Scripts können ausgeführt werden.
  • RemoteSigned (Remote signiert) – Heruntergeladene Scripte müssen von einem vertrauenswürdigen Autor signiert werden, bevor sie ausgeführt werden können.
  • Unrestricted (Uneingeschränkt) – Es gibt  keine Einschränkungen. Alle Windows PowerShell-Scripte können ausgeführt werden.

In diesem Zusammenhang gibt es 2 wesentliche Powershell cmdlets, die einem bei der Einstellung der Richtlinien helfen. Wenn man nicht sicher ist welche Richtlinien in welchem Kontext auf dem aktuellen System eingerichtet sind hilft einem das cmdlet Get-Executionpolicy:

Get-Executionpolicy -List

Durch das hinzufügen des -List Parameters wird einem die gesamte Liste für die einzelnen Bereiche, der auf dem derzeitigen System vorhandenen Ausführungsrichtlinien angezeigt.

Dies sind die vordefinierten Richtlinien und deren jeweiliger Scope auf einer neuen Windows 10 Installation. Generell gelten laut Microsoft diese Einstellung ebenfalls für Windows 8, Windows 8.1 und Windows Server 2012.

Die ersten beiden Richtlinien MachinePolicy und UserPolicy werden über das Group Policy Management der ActiveDirectory festgelegt. Bei der MachinePolicy wirkt sich die Ausführung von Scripten auf alle Benutzer des Computers aus, die Speicherung erfolgt auf der jeweiligen Maschine in der Registry unter dem Schlüssel ExecutionPolicy unter \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell. Die UserPolicy wirkt sich auf einen bestimmten Benutzerkreis aus. Der Process Scope ist nur während der laufenden Shell Sitzung gültig, er wird nicht gespeichert. Die Richtlinien für CurrentUser werden hingegen in der Registry gespeichert.

Um die Ausführung von Scripten permanent zu erlauben liefert das cmdlet Set-Executionpolicy die nötigen Eigenschaften. Sollte man dies beabsichtigen muss das absetzen des Befehls in einer Shell mit Administrationsrechten ausgeführt werden, ist dies nicht der Fall gibt die Fehlermeldung einen Hinweis darauf.

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy AllSigned

Set-ExecutionPolicy : Der Zugriff auf den Registrierungsschlüssel „HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell“ wurde verweigert. Starten Sie zum Ändern der Ausführungsrichtlinie für den Standardbereich (LocalMachine) Windows PowerShell mit der Option „Als Administrator ausführen“. Führen Sie zum Ändern der Ausführungsrichtlinie für den aktuellen Benutzer „Set-ExecutionPolicy -Scope CurrentUser“ aus.

Wenn die administrative Shell geöffnet ist, kann der Befehl erneut abgesetzt werden.

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy AllSigned

Es erfolgt der Hinweis auf weitere Informationen unter about_Execution_Policies und die Aufforderung die Aktion zu bestätigen.

Durch die Bestätigung wird das Ausführen von signierten Scripten für alle Benutzer auf der lokalen Maschine erlaubt. Sollte das Script keine digitale Signatur von einer vertrauenswürdigen Quelle besitzen wird dies mit einer dementsprechenden Fehlermeldung mitgeteilt:

Die Datei „C:\Users\…\*.ps1“ kann nicht geladen werden. Die Datei „C:\Users\…\*.ps1“ ist nicht digital signiert. Sie können dieses Skript im aktuellen System nicht ausführen. Weitere Informationen zum Ausführen von Skripts und Festlegen der Ausführungsrichtlinie erhalten Sie unter „about_Execution_Policies“

In einer Dev Umgebung kann dieses Verhalten durchaus störend sein, da man während der Entwicklung eines Scripts nicht unbedingt direkt eine Signatur hinzufügt. Daraus ergibt sich die Frage welche Richtlinie für welche Umgebung zum Einsatz kommen sollte. Abschließend kann diese Frage nur jeder für sich und seine jeweilige Umgebung beantworten.

Manipulation der Richtlinien 

$env:PSExecutionPolicyPreference = ‚unrestricted‘ ermöglicht es während einer laufenden Sitzung das Ausführen von Scripten für eben diese Sitzung zu erlauben. Es erfolgt keine dauerhafte Änderungen der Richtlinie. Eine kleine Besonderheit bei dieser Environment Variable ist die Tatsache das man sie über Intellisense nicht abrufen kann.