检查 Windows 更新文件的完整性

检查 Windows 更新文件的完整性

我必须频繁更新离线 Windows 系统。

所以我在 Windows 网站上下载了更新文件(KB)并在系统上运行该文件。

我想知道是否有推荐的方法来检查 Windows 更新文件 (kb) 的完整性。我的目的是确保文件正确,并且在应用之前没有以某种方式被修改。

所以我需要类似官方 MD5 签名的东西作为参考值来与下载文件的签名进行比较,但我找不到类似的东西。

答案1

所有 Windows 更新文件 (.exe、.msi、.msu、.cab) 均使用 Authenticode 进行签名 - 数据哈希与数字签名一起嵌入到文件中,因此 Windows 可以自行验证。

  • 通过 PowerShell:

    Get-AuthenticodeSignature foo.cab | Format-List
    
  • 通过 Cmd(仅当您拥有Windows 10 SDK已安装):

    signtool verify /v /pa foo.msi
    
  • 通过 GUI:

    1. 右键单击该文件,选择“属性”→“数字签名”。
    2. 从列表中选择一个签名,然后单击“详细信息”。

在这三种情况下,请确保签名有效且来自“Microsoft Code Signing PCA”(链接到 Microsoft Root Certification Authority)。

请注意,MD5 或 SHA1 哈希本身并不是签名。签名是由哈希和密钥(例如 Authenticode 签名证书)组合创建的。

答案2

如果您通过 Microsoft 更新目录下载了更新文件:

在此处输入图片描述

您将在其文件名中看到 MSU 包的 SHA1:

在此处输入图片描述

以蓝色突出显示的字符串是其 SHA-1(安全哈希算法-1) 值,该值始终为 40 个字符长,如果文件内容被修改,该值将会改变。

您可以使用此方法来检查该文件是否真实,您可以使用 PowerShell 来执行此操作;

首先,打开 PowerShell:

Win+ R>>类型PowerShell>> Ctrl+ Shift+Enter

然后,您需要文件的完整路径和文件名,在此示例中,文件被下载到默认的下载文件夹,即C:\Users\USERNAME\Downloads文件夹,在 PowerShell 中,您可以使用此变量:$home来表示C:\Users\Username(您的用户配置文件)文件夹。

您可以使用Get-Filehashcmdlet 获取文件的哈希值,然后使用-eq运算符将​​其与文件名中的哈希值进行对比,如果结果为,true则文件完好。如果结果为,false则文件已损坏。

我将举这个例子来更好地描述这个方法:

(get-filehash -path "$home\downloads\windows10.0-kb4592438-x86_95758bd6e2c3a4a98a19efaa4056213531f84f5c.msu" -algorithm SHA1).hash -eq "windows10.0-kb4592438-x86_95758bd6e2c3a4a98a19efaa4056213531f84f5c.msu".split("_")[1].substring(0,40)

它返回true,表示我的文件没有损坏。

使用时,只需将文件名和文件路径替换为要检查的文件的真实名称和路径即可。然后就可以了。

答案3

Суомынона's回答是正确的,我只想补充一点,你可以将代码包装在函数中:

function Check-Update {
Param(
  [Parameter(Mandatory=$True, Valuefrompipeline=$True)] [Validatenotnullorempty()] [String]$Path 
)
$IsGood=$false

if ($(Test-Path $Path) -and $Path.EndsWith(".msu")) {
    $SHA1 = [System.IO.Path]::GetFileNameWithoutExtension($Path).Split("_")[1]
    $Hash = (Get-FileHash -Path $path -Algorithm SHA1).Hash
    $IsGood=$($SHA1 -eq $Hash)
    Switch ($IsGood)
    {
        $true {Write-Host "Your update file: $path is NOT corrupted"}
        $false {Write-Host "Your update file: $path IS corrupted"}
    }
} else {
    Write-Error -Message "Update file: $path doesn't exist as a valid update file"
    }
}

将该函数粘贴到正在运行的 PowerShell 会话中,然后您可以通过调用该函数来检查更新文件的完整性,例如:

Check-Update "$home\downloads\windows10.0-kb4592438-x86_95758bd6e2c3a4a98a19efaa4056213531f84f5c.msu"

如果一切正常它将返回:

Your update file: C:\Users\Estranger\downloads\windows10.0-kb4592438-x86_95758bd6e2c3a4a98a19efaa4056213531f84f5c.msu is NOT corrupted

希望我的回答对您有所帮助;问候。

相关内容