若干年前的CIH、熊猫烧香到去年的勒索病毒告诉我们,及时打补丁特别是操作系统的安全补丁是很有很有必要的。所以,我一直都开启着Windows的自动更新功能,也很少遇到因为打补丁引起其他问题。然而,一旦重装系统,打补丁就非常头疼,因为太慢了。但是又不放心第三方的打补丁软件,必竟该打哪些补丁还是开发方才最具权威性。所以,2016年5月微软发布Windows 7 SP1 和 Windows Server 2008 R2 SP1 的方便使用汇总更新(KB3125574)时,赶紧制作了一张整合这个补丁的镜像,以为像是发布了SP2一样,安装之后自动更新会一个补丁都没有。然而,用这个镜像装出来的系统当时自动更新大约找到了四十几个补丁。仔细想一下,也好理解,发布SP版本就相当于发布一个新产品,就会有针对该产品的维护周期,那么发布时应该暂时不会有补丁。但是汇总补丁表明产品并没有变,那么找到没有汇总进去的补丁就很正常。汇总补丁不大可能把所有的补丁都汇总,必竟一个挺复杂的软件由多个可选择的部分组成,如果一个用户根本没有安装某个部分,那么针对这一部分的补丁自然就打不上去,即便忽略这个问题,强制打了补丁,那用户以后再安装这一部分怎么算?从补丁上看是已经打过补丁了,但实际显然是没有打的,就乱套了。所以,汇总更新很显然只能包含系统核心部分或者说所有人都必须安装的部分的补丁。所以,汇总更新不能也不可能汇总所有的补丁,以前认为汇总应该是所有补丁的汇总明显是一个认识误区。
随着时间的推移,使用集成了方便汇总更新(KB3125574)的安装盘安装的系统,自动更新检查出来的补丁数量越来越多,记得有一次看到检查出二百多个补丁。特别是2016年10月微软采用月度累积汇总方式发布更新后还检查出这么多补丁就非常不理解了。因为无论是从字面上理解还是网上的介绍,每个月的累积汇总更新都包含了上一个月的累积汇总更新,那么最新的累积汇总更新应该就包含了所有补丁至少是从采用累积更新方式以来的所有补丁,即便汇总更新只能包含核心的补丁,但外围的补丁应该也不会太多,而且也没有启用很多功能,就不应该检查出太多补丁啊。所以曾经认为,所谓的累积更新方式是骗人的。直到最近由于Windows 7 和 Windows Server 2008 R2技术支持已到期,准备自己汇总一下默认情况下系统会自动打多少补丁,这些补丁应该就是最基本的,集成到安装盘里面的话,基本就不用纠结补丁问题了,因为不会再有补丁了。结果才惊奇地发现,虽然安装完系统后检查出一百七十几个补丁,但是更新完之后实际只安装了几十个而已,后面陆陆续续又检查到一些补丁,但是这些补丁打了之后,总的已安装更新数量并没有增加,仍然是很稳定的几十个(60个左右),这就说明后面的补丁的确是替代了前面的补丁,并且连已安装补丁列表都被替代了。也就是说累积补丁是真的。
那么问题来了,既然累积补丁是真的,那为什么还要检查出一两百个补丁来而不是直接就安装最新的累积补丁呢?仔细琢磨了半天才想明白,直接装最新的累积补丁手工安装可以但是自动安装不行或者说行不通。为什么呢?首先,补丁是针对存在的问题进行修补,那么问题是否存在总要判断一下,至少没理由用旧的版本去替换新的版本吧。也就是补丁是要有先决条件的,不满足先决条件就不执行修补,这样虽然有问题至少还可以用,如果随便修改反而可能造成混乱而不可用。其次,补丁可能针对同一个地方进行多次修补,这样的话,每个补丁只能把上一个版本作为先决条件,否则,如果把更早的版本作为先决条件,那么相对较新的版本反而得不到更新了。所以,自动更新只能依次更新,而人工更新的话,就可以跳过中间的更新而直接用最新的版本来更新。当然,这里用文件版本号作为先决条件来判断只是举个例子,实际的判断肯定更复杂更严谨,除了文件版本号可能还有其他条件,仅就版本号来说有可能是小于x.x.x或者等于x.x.x等等,并且打补丁也不一定就是替换文件,有可能是修改某个配置参数而已。总之,对于自动更新,如果随意跳过某个中间补丁,有可能这个补丁能成功打上,但是由于可能由于漏掉了中间的补丁,造成后续无法继续更新。所以要确保自动更新能持续正常工作,必须很严格的依次更新,而人工更新的话,出了问题再人工撤回呗。这就是安装系统后检查出很多补丁,但是补丁打完之后已安装的补丁数量少得多的原因,也是我们感受不到累积补丁好处的原因,因为即便有累积补丁,采用自动更新的话仍然是依次一个补丁一个补丁的打的,检查出来的补丁数量当然会越来越多,花费的时间越来越长。
所以,正确的打补丁的方式是:安装完系统之后先手工安装最新的累积补丁(当然还得先打这个累积补丁的先决条件需要的补丁)。这样才能节约打补丁的时间。当然,这样做并不会影响累积补丁中未包含的补丁的,因为系统自动更新仍然会从当前产品第一个补丁开始检查是否需要更新的。原理前面已经说过了,为了保证自动更新的可持续和系统稳定,自动更新只能依次一个一个地检查,然后一个一个的安装,检查花的时间只会越来越长的,但关键的重要的补丁已经打好,其他的就让它后台慢慢地检查慢慢地安装吧,无所谓了。
顺便补充一下服务堆栈更新(SSU)的概念,服务堆栈更新往往是新补丁的先决条件之一。服务堆栈更新本身也有先决条件,就是上一次的服务堆栈更新。也就是服务堆栈更新把更新的范围分成了一段一段的,只有把前面的补丁打了,才能打后面的。这样就防止自动更新一次更新太多,老是更新不完。当然,更新程序本身也需要升级也是服务堆栈更新存在的原因。由于它是新补丁的先决条件,所以不会包含在累积更新里,是单独发布的。SSU有可能代替以前的SSU,有时候又不会,所以哪些需要哪些不需要还得手工安装或集成进行测试。在原始安装盘上集成较新的SSU或者在用原始安装盘新装的系统上直接安装了较新的SSU之后,由于更新堆栈变长了,前几次检查更新往往会失败,需要多检查几次才行。而逐步更新上来的话,虽然更新堆栈仍然变长,但是以前的补丁已经打过了,补丁信息也已经下载过了,所以也不太会出现检查更新失败的情况。
实际上,累积更新虽然包含了很多更新并且有自己的补丁号,但并不是说被汇总的补丁就不存在了,每一个具体的补丁都依然单独存在,汇总补丁作为一种方便的打补丁方式,只是把多个补丁集中在一起打而已,其先决条件必然也是所有补汇总补丁的先决条件,只要其中一个条件不满足,汇总补丁就不可能执行,这时候仍然可能分散的打其中一部分补丁的。根据前面的分析,使用自动更新的话,实际上是一个一个的小补丁打完,再打汇总补丁的。如果汇总补丁的先决条件满足,那么其中的每个补丁实际上都已经打上了,汇总补丁可能也就是更新一下已安装补丁的信息而已,而如果汇总补丁的先决条件不满足,那也没关系,反正所有能补的都补上了。只不过如果出现这种情况,恐怕后续的汇总补丁都没办法打了,这可能也是某些电脑上仍然有几百个补丁的原因吧。另外,服务堆栈更新可以就看成是更新程序的升级,新的服务堆栈总是包含旧的服务,所以前面虽然说更新的范围是一段一段的,像一个栈,但是如果服务堆栈更新后不能使用老的补丁,那就相当于更新之后就不允许启用以前没有启用的功能了,因为这些已经无法更新了。所以,直接把服务堆栈更新到最新是不应该有问题的。当然,作为某一个补丁先决条件的即便较旧的SSU也需要打。
以Windows 7 SP1为基础,打补丁或者集成补丁的正确顺序应该是下面这样:
1.安装KB3020369、KB3125574。(2015 年 4 月 Windows 7 和 Windows Server 2008 R2 的服务堆栈更新、Windows 7 SP1 和 Windows Server 2008 R2 SP1 的方便使用汇总更新)。
2.安装KB4490628、KB4474419。(2019 年 3 月 12 日服务堆栈更新、2019 年 9 月 10 日最新 SHA-2 更新)这两个是最后的月度汇总更新的先决条件。
3.安装KB4534310、KB4534314。(2020 年 1 月 14 日月度汇总和仅安全更新,累积汇总更新的历史在https://support.microsoft.com/zh-cn/help/4009469/windows-7-sp1-windows-server-2008-r2-sp1-update-history 里,但是,2020年1月14日是Windows 7和Windows Server 2008 R2的支持中止日期,之后的补丁只有购买了扩展安全更新 (ESU)的才能安装成功。
其他的补丁就视需要而定,下面是用按上述顺序安装补丁后又自动检查安装的补丁列表。其中一些不适用于Windows 7一些不适用于Windows Server 2008 R2。其中包含了NVMe支持补丁KB2990941、KB3087873。
KID | 描述 | Windows 7 | Windows Server 2008 R2 |
---|---|---|---|
KB977238 | 用于Windows Server 2008R2 x64 Edition的HYPER-V最佳实践分析工具更新程序(KB977238) | × | |
KB981390 | 用于Windows Server 2008R2 x64 Edition的Windows Server Update Services最佳实践分析工具更新程序(KB981390) | × | |
KB981391 | 用于Windows Server 2008R2 x64 Edition的Active Directory Rights Management Services最佳实践分析工具更新程序(KB981391) | × | |
KB981392 | 用于Windows Server 2008R2 x64 Edition的应用程序服务器最佳实践分析工具更新程序(KB981392) | × | |
KB2386667 | 用于Windows Server 2008R2 x64 Edition的应用程序服务器最佳实践分析工具更新程序(KB2386667) | × | |
KB2533552 | 尝试安装Windows 7 SP1、Windows Server 2008 R2 SP1或Windows Embedded Standard 7 SP1时可阻止“0xC0000034”错误消息的更新已发布 | × | |
KB2534111 | “当您使用Windows 7 SP1安装Windows 7的”“计算机名不能包含数字”“错误信息集成安装介质” | × | |
KB2545698 | 运行Windows Vista、Windows Server 2008、Windows 7或Windows Server 2008 R2的计算机的Internet Explorer 9中以某些核心字体显示的文本模糊 | ||
KB2547666 | 在运行Windows 7或Windows Server 2008 R2的计算机上无法从Internet Explorer浏览历史记录中删除长URL | ||
KB2574819 | 针对Windows 7 SP1和Windows Server 2008 R2 SP1中的DTLS添加支持的更新 | ||
KB2592687 | Remote Desktop Protocol 8.0更新程序 | ||
KB2603229 | 32位版本的两个注册表项的值在64位版本的Windows 7或Windows Server 2008 R2中错误 | ||
KB2667402 | MS12-020:终端服务器拒绝服务漏洞的安全更新说明:2012年3月13日 | ||
KB2670838 | Windows 7 SP1和Windows Server 2008 R2 SP1的平台更新 | ||
KB2676562 | MS12-034:Microsoft Office、Windows、.NETFramework和Silverlight的组合安全更新 | ||
KB2685811 | 适用于Windows Vista、Windows Server2008、Windows 7和Windows Server 2008 R2的1.11版内核模式驱动程序框架更新 | ||
KB2685813 | 适用于Windows Vista、Windows Server2008、Windows 7和Windows Server 2008 R2的1.11版用户模式驱动程序框架更新 | ||
KB2698365 | MS12-045:Microsoft数据访问组件中的漏洞可能允许远程执行代码:2012年7月10日 | ||
KB2706045 | MS12-056:JScript和VBScript引擎中的漏洞可能允许远程执行代码:2012年8月14日 | ||
KB2729094 | 现提供对Windows 7和Windows Server 2008 R2中SegoeUI符号字体的更新 | ||
KB2732059 | You cannot openan.oxps file in Windows 7 or in Windows Server 2008 R2 | ||
KB2750841 | 已推出用于Windows 7和Windows Server 2008 R2的IPv6准备就绪更新 | ||
KB2761217 | 已推出可向Windows 7和Windows Server 2008 R2添加Calibri Light和Calibri LightItalic字体的更新 | ||
KB2773072 | 更新更改在Windows 7 中的游戏分级系统 | × | |
KB2813347 | MS13-029:远程桌面连接7.0客户端的安全更新 | ||
KB2830477 | Remote Desktop Protocol 8.1更新程序 | × | |
KB2834140 | 在运行Windows 7 SP1或Windows Server 2008 R2 SP1的计算机上安装更新2670838后出现“0x00000050”停止错误 | ||
KB2841134 | Internet Explorer11 | ||
KB2841134 | Internet Explorer11zh_cn语言包 | ||
KB2862330 | MS13-081:USB驱动程序安全更新说明:2013年10月8日 | ||
KB2894844 | Windows 7 Service Pack1和Windows Server 2008 R2 Service Pack1上.NET Framework3.5.1的安全更新说明:2013年12月10日 | ||
KB2900986 | MS13-090:ActiveX KillBits累积安全更新:2013年11月12日 | ||
KB2912390 | MS14-007:Direct2D中的漏洞可能允许远程代码执行:2014年2月11日 | ||
KB2919469 | Canada country code is incorrectin Windows 7 SP1 or Windows Server 2008 R2 SP1 | ||
KB2923545 | RDP8.1更新补丁 | × | |
KB2970228 | 用以在Windows中支持俄罗斯卢布新货币符号的更新 | ||
KB2984972 | 用于支持Windows 7和Windows Server 2008 R2上的受限管理登录的RDC7.1更新 | ||
KB2990941 | 更新以在 NVM 速成版 Windows 7 和 Windows Server 2008 R2 中添加本地驱动程序支持 | ||
KB2993651 | MS14-045:内核模式驱动程序的安全更新 | ||
KB2999226 | Windows中的Universal C Runtime更新 | ||
KB3004375 | Microsoft安全公告:用于改善Windows命令行审核的更新:2015年2月10日 | ||
KB3006137 | 在Windows中,此更新将立陶宛的货币符号从立陶宛litas(Lt)更改为欧元(€) | ||
KB3018238 | MS14-066:Schannel中的漏洞可能允许远程执行代码 | × | |
KB3020369 | 2015年4月Windows 7和Windows Server2008 R2的服务堆栈更新 | ||
KB3020388 | MS15-004:安装了远程桌面连接8.1客户端更新时Windows 7和Windows Server 2008 R2的安全更新 | ||
KB3021917 | 更新到Windows7SP1的性能改进 | × | |
KB3031432 | MS15-015:Microsoft Windows 中的漏洞可能允许特权提升:2015 年 2 月 10 日 | ||
KB3035126 | “MS15-029:Vulnerabilityin Windows Photo Decoder component could allowinformationdisclosure:March10 2015” | ||
KB3046269 | MS15-037:Windows任务计划程序中的漏洞可能允许特权提升:2015年4月14日 | ||
KB3054205 | WinVerifyTrust函数的SIP的更新 | × | |
KB3059317 | MS15-060:Microsoft常用控件中的漏洞可能允许远程执行代码:2015年6月9日 | ||
KB3068708 | 更新的客户体验和诊断遥测 | ||
KB3075226 | MS15-082:WindowsRDP安全更新 | ||
KB3080149 | 更新的客户体验和诊断遥测 | ||
KB3087873 | "0x0000007E"stop 错误之后在 Windows 7 SP1 或 Windows Server 2008 R2 SP1 安装修补程序 2990941 | ||
KB3102429 | 在Windows中支持阿塞拜疆马纳特和格鲁吉亚语拉里货币符号的更新 | ||
KB3110329 | MS16-007:适用于Windows的安全更新程序说明:2016年1月12日 | ||
KB3118401 | Windows中的Universal C Runtime更新 | ||
KB3123479 | 对Microsoft根证书程序弃用SHA-1哈希算法 | ||
KB3124275 | MS16-001:Internet Explorer安全更新程序:2016年1月12日 | ||
KB3125574 | Windows7SP1和Windows Server 2008 R2 SP1的方便使用汇总更新 | ||
KB3138612 | Windows7和Windows Server 2008 R2的Windows更新客户端:2016年3月 | ||
KB3140245 | 启用TLS1.1和TLS1.2作为默认WinHTTP在Windows中的安全协议 | ||
KB3150513 | Windows的最新兼容性定义更新 | × | |
KB3155178 | MS16-056:Windows日记本的安全更新程序说明:2016年5月10日 | ||
KB3156016 | MS16-055:Microsoft图形组件的安全更新程序说明:2016年5月10日 | ||
KB3159398 | “MS16-072:DescriptionofthesecurityupdateforGroupPolicy:June142016” | ||
KB3161102 | Windows日记本中删除组件的更新 | ||
KB3161949 | MS16-077:WPAD安全更新程序说明:2016年6月14日 | ||
KB3170735 | Windows日记本的2016年7月更新 | × | |
KB3172605 | 2016年7月Windows 7 SP1和Windows Server 2008 R2 SP1更新汇总 | ||
KB3179573 | 8月2016年的Windows 7 SP1和Windows Server 2008 R2 SP1更新汇总 | ||
KB3184143 | 删除与Windows 10免费升级优惠活动相关的软件 | × | |
KB3185319 | MS16-104:Internet Explorer安全更新程序:2016年9月13日 | ||
KB4019990 | 在Windows Server 2012、Windows Server 7和Windows Server 2008 R2上的d3dcompiler_47.dll组件的更新 | ||
KB4040980 | 适用于Windows 7 SP1和Windows Server 2008 R2 SP1的.NET Framework3.5.1的安全与质量汇总(KB4040980) | ||
KB4474419 | 针对Windows Server 2008 R2、Windows 7和Windows Server 2008的SHA-2代码签名支持更新:2019年9月23日 | ||
KB4490628 | Windows 7 SP1和Windows Server 2008 R2 SP1的服务堆栈更新:2019年3月12日 | ||
KB4493132 | Windows 7 SP1支持通知 | × | |
KB4532945 | Windows 7 SP1和Windows Server 2008 R2 SP1的.NET Framework 3.5.1的安全与质量汇总(KB4532945) | ||
KB4534310 | 2020年1月14日-KB4534310(月度汇总) | ||
KB4534314 | 2020年1月14日-KB4534314(仅安全更新) | ||
KB4536952 | Windows7SP1和Server2008R2SP1的服务堆栈更新:2020年1月14日 |