Vlastní powershell skripty píšu ve starém, ale výborném PowerGUI editoru. Má neuvěřitelně skvělý systém doplňků. Postupně se snažím přejít na Visual Studio Code, ale stále mi chybí jedna věc. Jednoduše přes nějaké GUI podepsat výsledný .ps1 kód.

V bugttackeru pro VSC to je. Dlouho, ale prý to není urgentní a udělané to zatím není.

Prošel jsem weby a našel zajímavou inspiraci: vlastní powershell funkce, která si najde v OS úložišti certifikát pro podpis kódu, spojí s timestamp serverem a podepíše jeden nebo více .ps1 skriptů, předaných jako parametr(y).

Protože funkce bere parametry i z pipe a také pozičně, lze jí volat několika způsoby:

Set-Signature -FilePath MyScript.ps

Get-ChildItem *.ps1 | Set-Signature

a protože funkce má definován name alias, lze ji volat i krátkým názvem:

Sig MyScript.ps1

Pokud si funkci přidáte do powershell user profilu, bude lehce dostupná vždy.

function Set-Signature {
    [CmdletBinding()]
 
    [Alias('sig')]
 
    param(
 
        [Parameter(
            Mandatory,
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName
        )]
        [ValidateScript({Test-Path -Path $PSItem})]
        [ValidateNotNullOrEmpty()]
        [string[]]$FilePath
    )
 
    begin{
        $Certificate = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert |
            Where-Object -Property NotAfter -GT (Get-Date) |
            Sort-Object -Property NotAfter -Descending |
            Select-Object -First 1
    }
 
    process{
        foreach ($Path in $FilePath) {
            $TimeStampServer = @(
                'http://timestamp.verisign.com/scripts/timstamp.dll'
                'http://timestamp.globalsign.com/scripts/timstamp.dll'
                'http://timestamp.comodoca.com/authenticode'
            ) | Get-Random
 
            $Params = @{
                Certificate = $Certificate
                TimestampServer = $TimeStampServer
                HashAlgorithm = 'SHA256'
                FilePath = $Path
                Verbose = $True
            }
 
            Set-AuthenticodeSignature @Params
        }
    }
}