PowerShell スクリプトに署名できません

PowerShell スクリプトに署名できません

PowerShell でスクリプトに署名できないようです。有効なコード署名証明書をマシンにインストールし、次のコマンドを実行しています。何か提案はありますか?

PS C:\Users\u00\bin> $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
PS C:\Users\u00\bin> $cert | fl


Subject      : [email protected], CN=contoso , OU=Operations, O=contoso,
               L=Mayberry, S=Florida, C=US
Issuer       : CN=contoso Intermediate CA1, DC=contoso, DC=com
Thumbprint   : XXXXXXXXXXXXXXXXXXXXX
FriendlyName : contoso 
NotBefore    : 7/20/2010 12:58:55 AM
NotAfter     : 7/20/2011 12:58:55 AM
Extensions   : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oi
               ystem.Security.Cryptography.Oid...}



PS C:\Users\u00\bin> Set-AuthenticodeSignature .\testsign.ps1 -Certificate $cert


    Directory: C:\Users\u00\bin


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
                                          UnknownError                           testsign.ps1


PS C:\Users\u00\bin> Get-AuthenticodeSignature .\testsign.ps1

    Directory: C:\Users\u00\bin


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
                                          NotSigned                              testsign.ps1

答え1

分かりました。スクリプトファイルはPowerShell ISEを使用して作成されており、どうやらPowerShell ISE で作成されたスクリプトに署名できないまたは、より正確には、ISE のデフォルトである Unicode ビッグ エンディアンでエンコードされたファイルに署名することはできません。リンクに記載されているように、デフォルトのエンコードを変更する回避策があります。


元々質問に追加したのはチャド・ミラー更新を回答に移動したため、この質問は未回答として表示されなくなりました。

答え2

ISEFile オブジェクトの .Save() メソッドを使用して、Powershell ISE 内から特定のエンコーディングでファイルを保存できます。

 $psIse.CurrentFile.Save([System.Text.Encoding]::UTF8)

ISE プロファイルに以下を追加すると、Ctrl + Shift + S を押すだけで、スクリプトの別のデフォルト エンコーディングを取得できます。

$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("_Save as UTF8",{$psIse.CurrentFile.Save([System.Text.Encoding]::UTF8)},"Ctrl+Shift+S")

プロファイルが存在しない場合はプロファイルを作成し、メニューを追加するための簡単なコードを以下に示します。このコードを ISE 内から実行しないと、ConsoleHost プロファイルに不要な情報が追加され、エラーが発生します。

add-content $profile -value '$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("_Save as UTF8",{$psIse.CurrentFile.Save([System.Text.Encoding]::UTF8)},"Ctrl+Shift+S")'

関連情報