简介:面向系统运维人员与装机爱好者的离线补丁集成工具,针对Windows全系列产品在无网络或内网环境下打补丁耗时长、易遗漏的痛点,提供从补丁下载到镜像制作的完整方案。压缩包共636个文件,约2.11MB,以526个txt补丁清单与说明为主,辅以xsl表格、cmd批处理、vbs脚本及少量exe工具,通过脚本串联下载、安装与镜像生成流程。资源覆盖Windows XP至8.1、Server 2003至2012 R2及Office 2003至2013的x86/x64版本,能智能判断系统已安装补丁,避免重复安装,并支持将补丁集成为ISO镜像,便于批量部署与离线安装。已有2270人学习下载,适合需要为多台机器统一更新或搭建内网补丁源的技术人员参考,可省去装完系统后逐一手动打补丁的繁琐过程。
1. 离线更新这件事,版本选错比装错更麻烦
上周给一台内网 Windows Server 2016 补丁,机器连不上外网,我图省事拿了个网上随手找的离线更新包,结果装到一半报 0x800f081f,回滚又卡了四十分钟,最后只能进恢复环境手动清缓存。那次之后我才老老实实把离线更新下载工具的环境重新理了一遍。这类工具的核心价值就一句话:在完全断网的 Windows 环境里,把该打的补丁提前下好、校验好、按顺序装进去。它适合内网服务器运维、隔离网段的桌面维护,也适合给老机器做一次性补丁归档。装不好不是小事,轻则补丁装不上,重则系统组件损坏、开机进不了桌面。下面按我实际部署的顺序,从环境要求讲到验证跑通。
2. 装前把环境列清:系统版本、运行库和磁盘空间
2.1 先确认目标机的 Windows 版本和补丁基线
离线更新工具本身是跑在一台能上网的机器上做下载,再把产物搬到目标机安装,所以环境要分两头看。下载端我一般用 Windows 10 或 Windows 11 的常规桌面版,目标端才是真正要补的 Windows Server 2016/2019/2022 或 Windows 10 老版本。第一步不是急着装工具,而是先把目标机的版本号记下来,因为补丁包和系统 build 号强绑定,拿错基线后面全白干。
在目标机上开管理员权限的 PowerShell,跑下面这条把版本信息抓出来:
# 查看当前系统版本、build 号和已装补丁基线 Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsBuildNumber, OsArchitecture # 列出已安装的更新,确认当前补丁打到哪一批 Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 HotFixID, InstalledOnWindowsVersion和OsBuildNumber是后面选补丁包的关键,比如 Server 2016 常见 build 是 14393,Server 2019 是 17763,Server 2022 是 20348。Get-HotFix只列部分更新,但足够判断最近一批补丁有没有打上。我习惯把这两条的输出截图存一份,装完再对比,省得事后扯皮说补丁到底装没装。
提示:目标机如果是长期没更新的老系统,先确认它有没有装过 servicing stack 更新,缺这个的话后面的累积更新大概率装不上。
2.2 下载端的运行库和磁盘空间
下载端这边,工具本身通常依赖 .NET Framework 4.6 以上和 Visual C++ 运行库。Windows 10/11 自带 .NET 4.8,一般不用额外装;如果是干净的 Windows Server 做下载端,就得手动补。我一般先跑一条命令确认 .NET 版本,再决定要不要装运行库:
# 查看已安装的 .NET Framework 版本(注册表方式最准) Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' | Select-Object Version, ReleaseRelease值大于等于 528040 基本就是 4.8,够用。磁盘空间这块容易被忽略:一个完整的 Windows Server 累积更新加配套补丁,单月动辄几百 MB 到 1 GB 以上,如果要做多版本、多月份归档,预留 20 GB 以上比较稳妥。我一般单独划一个目录,比如D:\OfflineUpdate\,下载产物、校验文件、日志全放里面,出问题好定位也好清理。
2.3 权限和网络策略要先放开
下载端需要能访问微软的更新源,这一步在能上网的机器上通常没问题,但公司网络如果有出口策略,得提前确认放行。目标机安装阶段则要求管理员权限,并且 Windows Update 相关服务不能被组策略禁用。装之前先在目标机确认服务状态:
# 确认更新相关服务存在且可启动 Get-Service wuauserv, bits, cryptsvc | Select-Object Name, Status, StartTypewuauserv是 Windows Update 服务,bits负责后台传输,cryptsvc管签名校验。三个服务如果被设成 Disabled,离线包装到一半就会因为签名校验失败报错。常见做法是临时改成 Manual 再启动,装完按原策略恢复,别直接改成 Automatic 就不管了。
3. 下载和安装工具:目录规划、参数和第一次跑通
3.1 下载产物怎么放,目录结构先定死
工具拿到手之后,别急着双击。我踩过的坑是产物随手丢桌面,下了一堆补丁分不清哪个对应哪个系统。现在固定按「系统版本 / 补丁类型 / 月份」三层目录放:
D:\OfflineUpdate\ ├── Server2016\ │ ├── Cumulative\ │ └── SSU\ ├── Server2019\ │ ├── Cumulative\ │ └── SSU\ └── Logs\这样做的原因是离线补丁有严格的安装顺序,SSU(servicing stack update)必须先于累积更新装,混在一起很容易装反。目录分好之后,下载时按目标系统选,搬去内网时整目录拷,不会漏。日志单独放Logs,每次下载和安装都留一份,后面排查全靠它。
3.2 安装工具本体和首次配置
工具如果是绿色版,解压到固定路径即可,比如D:\Tools\OfflineUpdater\,不建议放Program Files下,因为部分工具写配置和缓存时需要目录可写,放系统目录反而容易因权限失败。如果是安装包形式,按默认路径装完,再确认安装目录下有可执行主程序和配置文件。
首次启动一般要配三样东西:下载源、目标系统版本、输出目录。以命令行方式调用时,参数大致是这样组织的:
# 以命令行方式触发下载:指定目标系统、补丁类型和输出目录 .\OfflineUpdater.exe --os Server2016 --build 14393 ` --type cumulative,ssu ` --output "D:\OfflineUpdate\Server2016" ` --log "D:\OfflineUpdate\Logs\download_2016.log"--os和--build决定拉哪条补丁线,--type控制只下累积更新和 SSU,--output是产物落点,--log把过程写进日志。参数名各家工具可能不同,但逻辑一致:先锁系统版本,再锁补丁类型,最后指定落点。第一次跑建议只下一个类型,确认产物正常再批量下,别一上来全勾选,失败了都不知道是哪一步。
3.3 下载完先校验,别直接搬去内网
下载完成后,工具一般会生成校验信息,或者产物本身带哈希。我的习惯是搬去内网前先在下载端做一次完整性校验:
# 对下载产物做 SHA256 校验,和工具输出的哈希比对 Get-ChildItem "D:\OfflineUpdate\Server2016\Cumulative\*.msu" | ForEach-Object { $hash = Get-FileHash $_.FullName -Algorithm SHA256 "{0} {1}" -f $hash.Hash, $_.Name }Get-FileHash输出每个.msu的 SHA256,和工具日志里记录的哈希逐个对。对不上的文件直接重下,别抱侥幸心理搬过去,内网装到一半校验失败,回滚成本比重新下高得多。这一步看着啰嗦,但它是离线更新里最省后悔药的一环。
4. 目标机安装:顺序、命令和回滚准备
4.1 安装顺序:SSU 在前,累积更新在后
离线补丁装反顺序是最常见的翻车点。正确顺序是先装 SSU,再装当月累积更新,如果跨了多个版本,还要按时间从旧到新装。手动安装.msu用wusa或者DISM,我一般用DISM,因为它对错误码的反馈更清楚:
# 先装 SSU,再装累积更新,/Quiet 静默,/NoRestart 先不重启 dism /Online /Add-Package /PackagePath:"D:\OfflineUpdate\Server2016\SSU\ssu_xxx.msu" /Quiet /NoRestart dism /Online /Add-Package /PackagePath:"D:\OfflineUpdate\Server2016\Cumulative\cu_xxx.msu" /Quiet /NoRestart/Online表示对当前运行系统操作,/Add-Package是装包,/Quiet不弹交互,/NoRestart让多个包装完再统一重启。全部装完再重启一次,比每个包都重启省时间,也减少中途失败的概率。如果某个包报错,DISM会在控制台直接给出错误码,比wusa的弹窗好查。
4.2 装之前先留回滚点
内网机器一旦补丁装坏,恢复环境不一定好进,所以我坚持装之前留一个系统还原点或者至少导出当前补丁状态:
# 创建系统还原点(需先启用系统保护) Checkpoint-Computer -Description "BeforeOfflineUpdate" -RestorePointType MODIFY_SETTINGS # 导出当前已装补丁清单,便于事后比对 Get-HotFix | Select-Object HotFixID, InstalledOn | Export-Csv "D:\OfflineUpdate\Logs\hotfix_before.csv" -NoTypeInformationCheckpoint-Computer要求系统保护已开启,没开的话先去系统属性里打开。导出 CSV 是为了装完能对比,确认目标补丁确实进去了。这两步加起来不到一分钟,但真出事的时候能省几个小时。
4.3 装完清理缓存,避免下次更新卡住
补丁装完,C:\Windows\SoftwareDistribution\Download下会留一堆缓存,不清的话下次更新可能因为空间或残留文件失败。我一般装完顺手清:
# 停更新服务,清下载缓存,再启动服务 Stop-Service wuauserv -Force Remove-Item "C:\Windows\SoftwareDistribution\Download\*" -Recurse -Force -ErrorAction SilentlyContinue Start-Service wuauserv-ErrorAction SilentlyContinue是防止个别文件被占用时报错中断,清不掉的下次重启再清也行。这一步不是必须,但对长期维护的机器来说,养成习惯能少很多玄学问题。
5. 避坑排查:五条血泪记录
5.1 报 0x800f081f,补丁装到一半回滚
现象是DISM装累积更新时报 0x800f081f,进度条走到一半回滚。原因通常是缺前置的 SSU 或者系统组件存储损坏。解决分两步:先确认 SSU 是否已装,没装先补 SSU;如果 SSU 已装还报这个错,跑DISM /Online /Cleanup-Image /RestoreHealth修复组件存储,再重装补丁。我遇到过一次是组件存储损坏,修复花了二十多分钟,但比重装系统强。
5.2 补丁装完版本号没变
现象是安装显示成功,但Get-ComputerInfo里 build 号没动。原因是装的是 SSU 或者前置包,不是累积更新本身,或者装完没重启。解决是先重启,再对比Get-HotFix输出和补丁 KB 号,确认装的到底是不是目标累积更新。离线包文件名和 KB 号对不上是常事,装之前一定核对清楚。
5.3 目标机提示「此更新不适用于你的计算机」
现象是双击.msu直接拒绝安装。原因是补丁和系统版本或架构不匹配,比如把 Server 2019 的包装到 Server 2016 上,或者 x64 包装到 x86 系统。解决是回到第 2 章确认 build 号和架构,重新下对应版本的包。这类错误一般不会损坏系统,但会浪费大量时间,所以下载端目录按版本分好很关键。
5.4 安装过程卡在「正在准备 Windows」
现象是重启后卡在准备界面很久,甚至超过一小时。原因是补丁量大或者磁盘慢,也可能是某个包和现有驱动冲突。解决是先耐心等,超过一小时再考虑进恢复环境卸载最近更新。我一般装大批量补丁前先确认磁盘剩余空间和健康状态,机械盘老机器尤其要留足时间。
5.5 组策略把更新服务锁死
现象是补丁装到一半报服务不可用。原因是组策略里把wuauserv或相关服务禁用,或者配置了指向内网更新源的策略冲突。解决是临时用gpresult /h导出策略确认,改回允许状态再装,装完按原策略恢复。这一步在域环境里特别常见,别上来就怀疑补丁包本身。
6. 装完怎么验证:三条命令确认真的跑通
验证这件事,我从来不信「安装成功」四个字,只信命令输出。装完重启后,先跑版本和补丁清单对比:
# 确认 build 号已更新,并列出最近安装的补丁 Get-ComputerInfo | Select-Object WindowsProductName, OsBuildNumber Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5 HotFixID, InstalledOn把OsBuildNumber和第 2 章记录的基线对比,变了说明累积更新生效;Get-HotFix里能看到目标 KB 号,说明补丁确实进去了。两条输出对得上,才算装成功。
再跑一次组件存储健康检查,确认没有留下隐患:
# 检查组件存储健康状态,输出 Healthy 才算干净 DISM /Online /Cleanup-Image /CheckHealth/CheckHealth只读不修,输出No component store corruption detected就放心了。如果报损坏,再跑/RestoreHealth修,别拖到下次更新才处理。
最后确认更新服务状态恢复正常,避免影响后续维护:
# 确认更新相关服务回到正常启动类型 Get-Service wuauserv, bits, cryptsvc | Select-Object Name, Status, StartType三个服务状态正常、启动类型和装之前一致,这套离线更新就算真正跑通了。我一般还会把这次下载的产物、日志、补丁清单归档到Logs目录,下次同版本机器直接复用,不用重新下。
从那以后我每次做离线更新,都强制走一遍「先记基线、再校验哈希、装前留还原点、装完三条命令验证」的流程,哪怕机器再急也不跳步。离线更新这活儿,快不是本事,装完不返工才是。希望帮到你。
本文还有配套的精品资源,点击获取