S. Brottes Asked: 2021-01-20 02:40:17 +0800 CST2021-01-20 02:40:17 +0800 CST 2021-01-20 02:40:17 +0800 CST 检查 windows 更新文件完整性 772 我必须经常更新离线 Windows 系统。 所以我在 Windows 网站上下载更新文件 (KB) 并在系统上运行该文件。 我想知道是否有推荐的方法来检查 Windows 更新文件 (kb) 的完整性。我的目的是确保文件是正确的,并且在应用之前没有以某种方式进行修改。 所以我需要像官方 MD5 签名这样的东西作为参考值来与下载文件的签名进行比较,但我找不到类似的东西。 windows updates 3 个回答 Voted Best Answer user1686 2021-01-20T03:05:05+08:002021-01-20T03:05:05+08:00 所有 Windows 更新文件(.exe、.msi、.msu、.cab)都使用 Authenticode 进行签名——数据散列和数字签名被嵌入到文件中,因此 Windows 可以自行验证。 通过 PowerShell: Get-AuthenticodeSignature foo.cab | Format-List 通过 Cmd(仅当您安装了Windows 10 SDK时): signtool verify /v /pa foo.msi 通过图形用户界面: 右键单击文件,选择“属性”→“数字签名”。 从列表中选择一个签名,然后单击“详细信息”。 在所有三种情况下,请确保签名有效并且来自“Microsoft 代码签名 PCA”(链接到 Microsoft 根证书颁发机构)。 请注意,MD5 或 SHA1 哈希本身不是签名。签名是通过哈希和密钥(例如 Authenticode 签名证书)的组合创建的。 user1263795 2021-01-20T03:38:41+08:002021-01-20T03:38:41+08:00 如果您通过 Microsoft 更新目录下载了更新文件: 您将在文件名中看到 MSU 包的 SHA1: 蓝色突出显示的字符串是它的 SHA-1 ( Secure Hash Algorithm-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,表示我的文件没有损坏。 使用时,只需将文件名和文件路径替换为您要查看的文件的真实名称和路径即可。然后你就可以走了。 Xeнεi Ξэnвϵς 2021-01-20T04:19:02+08:002021-01-20T04:19:02+08:00 Суомынона的回答是正确的,我只想补充一点,您可以将代码包装在一个函数中: 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 希望我的回答对你有所帮助;问候。
所有 Windows 更新文件(.exe、.msi、.msu、.cab)都使用 Authenticode 进行签名——数据散列和数字签名被嵌入到文件中,因此 Windows 可以自行验证。
通过 PowerShell:
通过 Cmd(仅当您安装了Windows 10 SDK时):
通过图形用户界面:
在所有三种情况下,请确保签名有效并且来自“Microsoft 代码签名 PCA”(链接到 Microsoft 根证书颁发机构)。
请注意,MD5 或 SHA1 哈希本身不是签名。签名是通过哈希和密钥(例如 Authenticode 签名证书)的组合创建的。
如果您通过 Microsoft 更新目录下载了更新文件:
您将在文件名中看到 MSU 包的 SHA1:
蓝色突出显示的字符串是它的 SHA-1 ( Secure Hash Algorithm-1 ) 值,它总是 40 个字符长,如果文件内容被修改,这个值将会改变。
您可以使用此方法检查文件是否真实,您可以使用 PowerShell 来执行此操作;
首先,打开 PowerShell:
Win+ R>>类型
PowerShell
>> Ctrl+ Shift+Enter然后你需要你的文件的完整路径和文件名,在这个例子中,文件被下载到默认的下载文件夹,也就是
C:\Users\USERNAME\Downloads
文件夹,在 PowerShell 中你可以使用这个变量:$home
来表示C:\Users\Username
(你的用户配置文件)文件夹。您可以使用
Get-Filehash
cmdlet 获取文件的哈希值,并通过使用-eq
运算符将其与文件名中的哈希值进行检查,如果结果是true
则文件是好的。如果它返回false
,则文件已损坏。我会给你这个例子来更好地描述这个方法:
它返回
true
,表示我的文件没有损坏。使用时,只需将文件名和文件路径替换为您要查看的文件的真实名称和路径即可。然后你就可以走了。
Суомынона的回答是正确的,我只想补充一点,您可以将代码包装在一个函数中:
将该函数粘贴到工作中的 PowerShell 会话中,然后您可以通过调用该函数来检查更新文件的完整性,例如:
如果一切正常,它将返回:
希望我的回答对你有所帮助;问候。