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.

Zertifikat anfordern
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"