You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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下运行会出现与文档不符的结果。

解决办法

  1. 优先使用-FilePath参数:如果目标是验证已存在的文件签名,直接通过文件路径调用是最可靠的方式。
  2. 临时文件中转:如果必须处理字节数组,可将字节写入临时文件后再验证:
    $tempFile = [System.IO.Path]::GetTempFileName() + '.ps1'
    [System.IO.File]::WriteAllBytes($tempFile, $byteArray)
    $foo3 = Get-AuthenticodeSignature -FilePath $tempFile
    # 验证后清理临时文件
    Remove-Item $tempFile -Force
    
  3. 升级到PowerShell 7+:Core版本中-Content参数可以正确处理包含签名的字节数组,行为与文档一致。

内容的提问来源于stack exchange,提问作者Lukas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:55:08