Wer schon mal in der PowerShell ein eigenes oder heruntergeladenes Skript ausführen wollte, dem ist die folgende Fehlermeldung mit Sicherheit vertraut.
Aus Sicherheitsgründen dürfen mit den Standardeinstellung nur signierte PowerShell Skripts ausgeführt werden. Um ein Skript dennoch ausführen zu können, wird in vielen Artikeln, als Lösung, das Setzten der Ausführungsrichtlinie auf “uneingeschränkt” ( set-executionpolicy unrestricted ) vorgeschlagen.
Da dies den gesamten Sicherheitsmechanismus aus-hebelt, halte ich das Signieren eigener Skripts mit einem selbst erstellen Zertifikat für eine sinnvollere Alternative.
Dazu ändern wir zunächst die Richtlinie von “Restricted” auf “AllSigned”
Set-ExecutionPolicy AllSigned
Und erzeugen danach unser eigenes, persönliches Zertifikat mit folgendem Kommando
New-SelfSignedCertificate -CertStoreLocation cert:\currentuser\my ` -Subject "CN=PowerShellAllSigned" ` -Type CodeSigningCert ` -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" ` -NotAfter (Get-Date).AddYears(10) ` -KeyAlgorithm RSA ` -KeyUsage DigitalSignature ` -KeyExportPolicy Exportable
Starten wir nun der Zertifikatsmanager für unsere persönlichen Zertifikate mit “certmgr /s my”, so sollten wir unser Zertifikat mit dem Namen “PowerShellAllSigned” in der List sehen können.
Damit der Rechner diesem Zertifikat auch vertraut, muss es in die Ordner für “Trusted Root Certification Authorities” und “Trusted Publishers” kopiert werden.
Im Anschluss, kann das auszuführende PowerShell Skript nun signiert werden.
Dazu holen wir uns zuerst das erstellte Zertifikat mit
$cert = Get-ChildItem -Path cert:\CurrentUser\My -CodeSigningCert -DNSName "PowerShellAllSigned"
und verwenden dieses dann um schließlich mit
Set-AuthenticodeSignature .\Hyper-V-Backup.ps1 $cert
das Skript zu signieren.
Wenn wir nun das PowerShell Skript erneut aufrufen, lässt es sich wie erwartet ausführen.
Von uns nicht signierte Skripts werden aber nach wie vor an der Ausführung gehindert.
So soll es sein!
17. June 2019
[…] Um das Backup zu automatisieren, kann man das Kommando noch in eine .BAT-Datei packen und dann via Task Scheduler ausführen lassen. Dabei gilt es zu beachten, dass, um das PowerShell-Skript ausführen zu können, die entsprechende ExecutionPolicy gesetzt werden muss. Um als Policy “AllSigned” verwenden zu können, muss man das Skript zunächst mit einem eigenem Zertifikat signieren. Wie das genau geht, könnt ihr hier nachlesen. […]