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.ps1PowerShellWindows nutzt einen Backslash \
cd Documents\Skripte
Get-Item .\download.ps1PowerShellUmgebung 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-ExecutionPolicyPowerShellEs 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.
| Policy | lokal, unsigniert | lokal, signiert | remote, unsigniert | remote, signiert | Internet, unsigniert | Internet, signiert |
| Unresticted | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ |
| RemoteSigned | ✅ | ✅ | ❎ | ✅ | ❎ | ✅ |
| AllSigned | ❌ | ✅ | ❌ | ✅ | ❌ | ✅ |
| Restricted | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Bypass | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
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.IdentifierPowerShellFolgende Werte können als Ergebnis erscheinen:
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 *PowerShellWir 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=3u0022PowerShellNoch einfacher geht das Datei entsperren mit dem folgenden Commandlet:
Unblock-File -Path ./download.ps1PowerShellAllSigned
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 RemoteSignedPowerShellDanach 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 UnrestrictedPowerShellUm nur für unseren Benutzer die Einstellung zu ändern, können wir folgenden PowerShell Befehl verwenden:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUserPowerShellMacOS / Linux Besonderheit
Kleiner Fun Fact am Rande: MacOS und Linux können nur „Unrestricted“ setzten. Eine andere Einstellung ist nicht möglich.