Wie signiere ich ein PowerShell-Skript?

21833
Ville Koskinen

Ich ziehe es vor, die AllSigned-Ausführungsrichtlinie mit PowerShell zu verwenden, aber das selbstsignieren meiner Skripts scheint mehrere Hundert Megabytes für das Herunterladen und die Installation zu erfordern.

Gibt es eine einfachere Methode zum Signieren eines PowerShell-Skripts als in der Dokumentation beschrieben?

13

3 Antworten auf die Frage

7
Richard

Zum Signieren können Sie das Set-AuthenticodeSignatureCmdlet verwenden. Dies erfordert natürlich ein Zertifikat. Wenn Sie über eine Zertifizierungsstelle verfügen (unwahrscheinlich), können Sie ein Codesignaturzertifikat erstellen. Ansonsten gibt es verschiedene Tools zum Erstellen eines selbstsignierten Zertifikats.

Sie installieren das Zertifikat in Ihrem Zertifikatspeicher (öffnen Sie dazu die Datei .ceroder .pfxin Windows Explorer) und geben Sie es an Set-AuthenticodeSignature(der cert:Provider / das Laufwerk gibt Zugriff auf die Zertifikate in Ihrem Speicher).

Benutzen

help about_signing 

für Details (einschließlich Erstellen eines selbstsignierten Zertifikats mit den Windows SDK-Tools [1]).

[1] Ich gehe davon aus, dass dies der große Download ist: Sie können nur die benötigten Bits installieren oder andere Tools verwenden (OpenSSL beinhaltet die Zertifikaterstellung). Der Erwerb des SDK ist zu diesem Zweck eine einmalige Aktivität

Ich akzeptiere diese Antwort und gehe davon aus, dass es keine Abkürzung gibt, und das Signieren muss nur wie in den Dokumenten beschrieben erfolgen. Ville Koskinen vor 14 Jahren 0
Wie bei vielen "Entwicklern" -Dingen ist das anfängliche Einrichten und Lernen schwer, aber die eigentliche Praxis (besonders wenn sie regelmäßig durchgeführt wird) ist nicht so. Richard vor 14 Jahren 0
7
Bratch

Ich verwende dieses PowerShell-Skript:

## sign-script.ps1 ## Sign a powershell script with a Thawte certificate and  ## timestamp the signature ## ## usage: ./sign-script.ps1 c:\foo.ps1   param([string] $file=$(throw “Please specify a script filepath.”))   $certFriendlyName = "Thawte Code Signing" $cert = gci cert:\CurrentUser\My -codesigning | where -Filter  {$_.FriendlyName -eq $certFriendlyName}  # https://www.thawte.com/ssl-digital-certificates/technical-  # support/code/msauth.html#timestampau # We thank VeriSign for allowing public use of their timestamping server. # Add the following to the signcode command line:  # -t http://timestamp.verisign.com/scripts/timstamp.dll  $timeStampURL = "http://timestamp.verisign.com/scripts/timstamp.dll"  if($cert) { Set-AuthenticodeSignature -filepath $file -cert $cert -IncludeChain All -  TimeStampServer $timeStampURL } else { throw "Did not find certificate with friendly name of `"$certFriendlyName`"" } 
5
Fawr

Once I had the certificate, I wanted to use imported on my user account. This regkey gave me an option, Sign, in the context menu (I'm using Windows 7). If the certificate you want to sign with is stored differently, just change the PowerShell command at the end.

Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1] [HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell] [HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign] [HKEY_CURRENT_USER\Software\Classes\Microsoft.PowerShellScript.1\Shell\Sign\Command] @="C:\\\Windows\\\System32\\\WindowsPowerShell\\\v1.0\\\powershell.exe -command Set-AuthenticodeSignature '%1' @(Get-ChildItem cert:\\\CurrentUser\\\My -codesigning)[0]"