Schnupperkurs – Vorbereitung der PowerShell Umgebung

PowerShell ist Plattformunabhängig. Wir können PowerShell also auf Windows, macOS oder Linux verwenden. Es gibt jedoch in manchen Bereichen ein paar kleine Unterschiede zwischen PowerShell von Windows und macOS bzw. Linux. Das liegt ein kleines bisschen in der Natur der Sache. Unterschiede kannst du auf der Microsoftseite finden: https://learn.microsoft.com/en-us/powershell/scripting/whats-new/unix-support?view=powershell-7.3  

Kurz eingeschobener Hinweis

Bitte beachte das in die folgenden Skripten nicht 1:1 bei dir funktionieren könnten. Je  nach Betriebssystem. Immer wenn es um Verzeichnisse geht. Ich nutze vorrangig MacOS.

MacOS und Linux nutzt den Slash /

cd Documents/Skripte
Get-Item ./download.ps1
PowerShell

Windows nutzt einen Backslash \

cd Documents\Skripte
Get-Item .\download.ps1
PowerShell

Umgebung vorbereiten

Prinzipiell haben wir jetzt eigentlich schon alles was wir brauchen. Eine Kleinigkeit müssen wir noch festlegen. Aus Sicherheitsgründen lassen sich PowerShell Skripte nämlich nicht einfach so starten (das ist gut nachvollziehbar). Wir als angehende PowerShell Profis möchten das jedoch.

Öffne eine PowerShell Konsole als Administrator (wie man das am schnellsten macht, steht im Kapitel vorher). Gebe jetzt folgendes ein:

Get-ExecutionPolicy
PowerShell

Es gibt hier jetzt unterschiedliche Level zum freischalten. Resctricted (das ist der Standard) bedeutet, es sind alle Skripte blockiert. Interessanterweise merkt sich Windows das nicht nur für den Computer, sondern kann sich das auch für jedes Skript einzeln merken. So kann man schnell eine Ausnahme definieren.

Policylokal, unsigniertlokal, signiertremote, unsigniertremote, signiertInternet, unsigniertInternet, signiert
Unresticted⚠️
RemoteSigned
AllSigned
Restricted
Bypass
Policy Tabelle
  • Lokal = Skripte die wir lokal auf dem PC ausführen
  • Remote = Skripte die aus dem eigenen Netzwerk ausgeführt werden
  • Internet = Skripte die online heruntergeladen wurden
  • Signiert = Skript wurde mit einer digitalen Signatur versehen
  • Unsigniert = Skript ohne Signatur

Signiert bedeutet, das ein Skript von einer „vertrauenswürdiger Quelle“ kommt. Wir können den Inhalt des Skriptes lesen. Zusätzlich ist am Ende des Skriptes eine digitalen Signatur angehangen. Diese Signatur wird aus einem Zertifikat und dem Quellcode generiert. Wird das Skript geändert, kann es nicht mehr ausgeführt werden, da es manipuliert wurde. Wir gehen hier nur auf unsignierte Skripte ein.

Unrestricted

Alles ist frei. Jedes Skript darf ausgeführt werden. Unsignierte Skripte aus dem Internet erzeugen eine Rückfrage.

RemoteSigned

Ist ein Zwischending von Unrestricted und AllSigned. RemoteSigned bezieht sich stark auf die die Einstellungen des PCs. Wird ein Skript erkannt, das aus dem Internet heruntergeladen wurde, oder von bestimmten Netzwerkpfaden aus dem Intranet (internes Firmennetzwerk), müssen diese Skripte signiert sein. 

Genauer gesagt wird das am sogenannten „Zone.Identifier“ erkannt. Windows erkennt woher der Datenstrom ursprünglich kommt. 

Wir können uns ansehen woher das Skript kommt, mit folgendem PowerShell Befehl (hier mit dem Beispiel der Datei „download.ps1“):

Get-Item ./download.ps1 -Stream Zone.Identifier
PowerShell

Folgende Werte können als Ergebnis erscheinen:

  • 0: Local Machine / Lokale Maschine
  • 1: Local Intranet / Lokales Intranet
  • 2: Trusted Sites / Vertrauenswürdigen Seiten
  • 3: Internet / Internet
  • 4: Restricted Sites / Eingeschränkte Seiten

Möchten wir ein heruntergeladenes Skript trotzdem ausführen, können wir das Skript als „sicher“ einstufen.

Dazu musst du in den Dateieigenschaften (Rechtsklick auf die Datei → „Eigenschaften“) gehen. Unten im Abschnitt „Sicherheit“ den Haken „Zulassen“ setzten und „OK“ drücken.

Da wir ja jetzt viel mit PowerShell machen wollen, können wir das natürlich auch damit machen.

Get-Item ./download.ps1 -Stream Zone.IdentifiernClear-Content ./download.ps1 -Stream Zone.IdentifiernGet-Item ./download.ps1 -Stream *
PowerShell

Wir können auch die Datei Kennzeichen, als wäre sie aus dem Internet heruntergeladen:

Add-Content ./download.ps1 -Str Zone.Identifier u0022[ZoneTransfer]`r`nZone=3u0022
PowerShell

Noch einfacher geht das Datei entsperren mit dem folgenden Commandlet:

Unblock-File -Path ./download.ps1
PowerShell

AllSigned

Nur Signierte Skripte dürfen ausgeführt werden.

Bypass

Damit kann man zum Beispiel ein Skript frei ausführen. Das ist eine sichere Variante, wenn man im eigenen Netzwerk bestimmte Skripte ausführen möchte. Dann aber immer nur als Admin.

Damit wir jetzt lokale Skripte jederzeit frei ausführen können, setzten wir folgendes:

Set-ExecutionPolicy RemoteSigned
PowerShell

Danach werden wir gefragt ob wir das Sicherheitssystem anpassen möchten. Wir geben „A“ für „Ja, alle“ ein.

ExecutionPolicy in verschiedenen Scopes verwenden

Scopes? Scopes sind Umgebungsbereiche. Wir können uns die PowerShell Scopes anzeigen lassen mit (Zeile 3-9 ist das Ergebnis):

Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    Unrestricted
   UserPolicy    Unrestricted
      Process    Unrestricted
  CurrentUser    Unrestricted
 LocalMachine    Unrestricted
PowerShell
  • MachinePolicy: Gesetzt durch eine Windows Gruppenrichtlinie (in Firmennetzwerken durch Netzwerkadministratoren festgelegt): Für alle User auf dem PC
  • UserPolicy: Gesetzt durch eine Windows Gruppenrichtlinie: Nur für bestimmte Benutzer auf dem PC
  • Process: Eine sehr filigrane Einstellung. Dieser Scope gilt nur für die aktive PowerShell Session oder Skript
  • CurrentUser: Nur für den aktuell angemeldeten Benutzer
  • LocalMachine: Für alle User auf dem PC (erfordert Administratorberechtigungen, um das zu ändern)

Um nur für unseren Benutzer die Einstellung zu ändern, können wir folgenden PowerShell Befehl verwenden:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
PowerShell

MacOS / Linux Besonderheit

Kleiner Fun Fact am Rande: MacOS und Linux können nur „Unrestricted“ setzten. Eine andere Einstellung ist nicht möglich.