Um Powershell Code auf restriktiv konfigurierten Systemen (Set-ExecutionPolicy AllSigned) zum laufen zu bringen ist ein Codesignaturzertifikat notwendig. Ich zeige euch hier wie es geht.
Zertifikat
Für die Codesignatur muss zuerst ein Codesignierungszertifikat erstellt werden. Je nach Einsatzzweck gibt es unterschiedliche Möglichkeiten ein solches Zertifikat zu erhalten. Soll das Zertifikat weltweit akzeptiert werden, muss es von einer vertrauenswürdigen Zertifizierungsstelle erworben werden.
Für mich reichte bisher ein Zertifikat, dass im Unternehmen als vertrauenswürdig gilt. Es bietet sich an ein solches Zertifikat über die Unternehmens PKI anzufordern. Öffnet dazu das MMC Zertifikate und fordert ein neues Codesignierungszertifikat an.
Wenn keine Unternehmens-PKI zur Verfügung steht kann man sich z.B. ein Zertifikat selbst generieren und per Gruppenrichtlinie verteilen. Dazu gibt es genug Infos im Netz. Sollte ich das mal machen aktualisiere ich diesen Beitrag. Könnte aber dauern…
Codesignatur
Ohne Timstamp Server
$cert=(dir cert:currentuser\my\ -CodeSigningCert) Set-AuthenticodeSignature "<pfad-zum-script>\script.ps1" $cert
Mit Timestamp Server
Damit der signierte Code weiterhin funktioniert, auch wenn das zum Signieren genutzte Zertifikat abgelaufen ist, muss ein Timestamp Server genutzt werden. Über den Timestamp Server wird der Signatur ein Datum hinzugefügt. Damit ist klar, dass das Zertifikat zum Zeitpunkt der Sigantur gültig war. Hier eine Liste kleine Auswahl:
http://timestamp.verisign.com/scripts/timstamp.dll http://timestamp.globalsign.com/scripts/timstamp.dll http://tsa.starfieldtech.com http://timestamp.comodoca.com/authenticode http://www.startssl.com/timestamp
$cert=(dir cert:currentuser\my\ -CodeSigningCert) Set-AuthenticodeSignature "<pfad-zum-script>\script.ps1" $cert -TimeStampServer "http://timestamp.verisign.com/scripts/timstamp.dll"
Einzeiler
Das alles geht per Einzeiler. Wenn man mehrere Codesignierungszertifikate besitzt kann man auch gleich das richtige Zertifikat suchen.
Set-AuthenticodeSignature -filepath "<pfad-zum-script>\script.ps1" -cert gci cert:\CurrentUser\My -codesigning | where -Filter {$_.FriendlyName -eq "Globalsing Code Signing"} -IncludeChain All -TimeStampServer "http://timestamp.verisign.com/scripts/timstamp.dll"