无法签署PowerShell脚本


8

我似乎无法让我的脚本登录PowerShell。我的机器上安装了有效的代码签名证书,并运行以下命令。有什么建议么?

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


Subject      : E=operations@contoso.com, 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

很高兴知道。我正在查看您的问题,因为如果没有PC管理员身份,我也无法签名脚本。我在这里问过这个问题:superuser.com/questions/174878/…–
Bratch

4
好问题,感谢您发回答案。您应该继续并将您的修改发布在答案部分,然后在超时后将其标记为正确,以便人们可以更清楚地看到此问题已得到回答。
Caleb 2010年

在ISE中编辑脚本时,尝试使用Subversion时遇到类似的问题。Subversion抱怨说ISE保存的文件是“二进制mime类型”,不会将它们添加到存储库中。我在下面的答案中为Notepad.exe方法发布了一种更平滑的解决方法。
Ryan Fisher

Answers:


4

弄清楚了。该脚本文件是使用PowerShell ISE创建的,显然您不能对在PowerShell ISE中创建的脚本进行签名,或者更准确地说,您不能对ISE的默认Unicode Big Endian编码文件进行签名。有一种解决方法可以更改链接中记录的默认编码。


最初是由乍得·米勒Chad Miller)提出的。将他的更新重新定位为答案,因此该问题不再显示为未回答。


必知-Unicode文件编码问题在其他地方(写得不好的XML解析器)使我痛苦不已。
赫尔维克,2010年

还有一天,我写了一个脚本来导出BIND DHCP的MS-DHCP租约。再次使用Unicode。
sysadmin1138

3

您可以使用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")'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.