Get-AuthenticodeSignature处理字节数组无效,PowerShell 5是否有相关限制?
Get-AuthenticodeSignature在PowerShell 5.x处理字节数组的问题
问题现象
对同一已签名文件,使用Get-AuthenticodeSignature的两种调用方式返回的签名状态完全不一致:
$file = 'C:\Temp\foo.ps1' $byteArray = [System.IO.File]::ReadAllBytes($file) $foo1 = Get-AuthenticodeSignature -FilePath $file $foo2 = Get-AuthenticodeSignature -SourcePathOrExtension $file -Content $byteArray
执行结果:
PS C:\Temp> $foo1.Status Valid PS C:\Temp> $foo2.Status NotSigned
原因分析
这是PowerShell 5.x的已知行为限制:
- 使用
-FilePath参数时,函数直接读取文件系统中的文件,能正确识别附加在文件末尾的Authenticode签名区块。 - 而
-Content参数在PS5.x中的实现逻辑,主要针对未写入文件的内存内容(比如正在编辑的脚本字节流)设计,它不会正确解析已签名文件字节数组中包含的签名区块——哪怕字节数组包含完整的文件内容(包括签名),函数也无法识别。 - 微软文档中的示例4基于PowerShell Core(7+)编写,该版本已修复此兼容性问题,因此PS5.x下运行会出现与文档不符的结果。
解决办法
- 优先使用
-FilePath参数:如果目标是验证已存在的文件签名,直接通过文件路径调用是最可靠的方式。 - 临时文件中转:如果必须处理字节数组,可将字节写入临时文件后再验证:
$tempFile = [System.IO.Path]::GetTempFileName() + '.ps1' [System.IO.File]::WriteAllBytes($tempFile, $byteArray) $foo3 = Get-AuthenticodeSignature -FilePath $tempFile # 验证后清理临时文件 Remove-Item $tempFile -Force - 升级到PowerShell 7+:Core版本中
-Content参数可以正确处理包含签名的字节数组,行为与文档一致。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

