我似乎无法让我的脚本在 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 中创建的脚本进行签名或者更准确地说,您无法对 Unicode Big Endian 编码的文件进行签名,这是 ISE 的默认设置。有一种解决方法可以更改默认编码,如链接中所述。
最初添加到问题中查德·米勒。将他的更新重新定位到答案,这样该问题就不再显示为未回答。
答案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")'