Windows Server 2019 搭建 WSUS
WSUS,Windows Server Update Service,Windows服务器更新服务,用途是统一下载更新并分发给企业网内部的计算机,适用于Windows Server和桌面操作系统。本文简单部署,利用一台可以访问互联网的WSUS服务器,用于整个企业网内的更新下载和分发。
1.准备工作
- 第1步,资源规划,考虑到补丁越来越大,若为生产系统且客户端数量较多,则建议磁盘至少1TB
补:本文亦适用于 Windows Server 2022,只是安装 .NET Framework 3.5 需要用到 windows 2022 的 sxs 资源包
| ip地址 | 机器名 | 配置 | OS版本 | 客户端数量 | wsus存储目录 |
|---|---|---|---|---|---|
| 192.168.31.101 | WSUS | 4C-16G-500GB | Windows Server 2019 | 1000-1500个 | D:\WindowsUpdate |
- 第2步,确认OS与安装WSUS的磁盘分区必须是NTFS格式文件系统
fsutil fsinfo volumeinfo c: | findstr 文件系统名
fsutil fsinfo volumeinfo d: | findstr 文件系统名
- 第3步,将服务器更名为:WSUS
wmic computersystem where name="%computername%" call rename name="WSUS"
- 第4步,防火墙放行端口,主要是开放 TCP 80/443/8530/8531 给
192.168.*.*访问
netsh advfirewall set allprofiles state off
netsh advfirewall firewall set rule name=all dir=in new enable=no
netsh advfirewall firewall set rule name=all dir=out new enable=no
netsh advfirewall firewall add rule name="permit_ping_echo_request" protocol=ICMPv4 dir=in action=allow
netsh advfirewall firewall add rule name="permit_mstsc_tcp_3389" protocol=TCP dir=in remoteip=192.168.0.0/255.255.0.0 localport=3389 action=allow
netsh advfirewall firewall add rule name="permit_http_tcp_80" protocol=TCP dir=in remoteip=192.168.0.0/255.255.0.0 localport=80 action=allow
netsh advfirewall firewall add rule name="permit_https_tcp_443" protocol=TCP dir=in remoteip=192.168.0.0/255.255.0.0 localport=443 action=allow
netsh advfirewall firewall add rule name="permit_wsus_tcp_8530" protocol=TCP dir=in remoteip=192.168.0.0/255.255.0.0 localport=8530 action=allow
netsh advfirewall firewall add rule name="permit_wsus_tcp_8531" protocol=TCP dir=in remoteip=192.168.0.0/255.255.0.0 localport=8531 action=allow
netsh advfirewall firewall add rule name="block_in_tcp_135_137_138_139_445" protocol=TCP dir=in localport=135,137,138,139,445 action=block
netsh advfirewall firewall add rule name="block_in_udp_135_137_138_139_445" protocol=UDP dir=in localport=135,137,138,139,445 action=block
netsh advfirewall firewall add rule name="block_out_tcp_135_137_138_139_445" protocol=TCP dir=out localport=135,137,138,139,445 action=block
netsh advfirewall firewall add rule name="block_out_udp_135_137_138_139_445" protocol=UDP dir=out localport=135,137,138,139,445 action=block
netsh advfirewall set allprofiles state on
- 第5步,通过 dism 启用 .NET Framework 3.5 功能
cd /d c:\
wget -c http://iso.sqlfans.cn/windows/win2019/sources.zip
unzip sources.zip
dism /online /enable-feature /featurename:NetFX3 /All /Source:C:\sources\sxs /LimitAccess
- 第6步,配置dns(首选DNS选择域控ip,备用DNS选择 223.5.5.5),确保 WSUS 服务器可以访问公网的 Microsoft 域(
*.windows.com、*.microsoft.com、*.windowsupdate.com),拓扑图如下所示:
- 第7步,重启服务器,加域(如果有)并将域账号(wsus_admin)加入本地管理员组,再次重启服务器
shutdown /r /t 0
2.安装 WSUS 角色
- 第1步,使用本地 Administrators 管理员组成员的帐户登录到 WSUS 服务器
- 第2步,依次选择“服务器管理器 -> 添加角色和功能 -> 服务器角色”,勾选“Windows Server 更新服务”
- 第3步,功能,默认即可
- 第4步,选择WSUS的角色服务,默认即可
- 第5步,自定义更新文件的存储位置,可以使用WSUS服务器的本地位置,也可以使用网络上的共享存储。若本地位置则无需额外设置权限(比如共享),默认即可。示例选择 D:\WindowsUpdate
- 第6步,配置 Web 服务器角色,默认即可
- 第7步,点击“关闭”完成安装
3.配置 WSUS 向导
- 第1步,依次选择“服务管理器 - 工具 - Windows Server 更新服务”,首次打开会弹出如下界面,先点“运行”,结束后再点“关闭”
注:不要删除 IIS 默认的站点(Default Web Site),否则这一步会报错“严重错误: 系统找不到指定的路径”
- 第2步,首次运行会弹出配置向导,点击“下一步”
- 第3步,建议不要加入改进计划
- 第4步,由于是简单部署,这里配置 直接通过互联网从Microsoft获取更新。如果是多台WSUS服务器分级部署,请选择第二项去连接内网中的其他WSUS服务器
- 第5步,点击“开始连接”,需要很长时间,请耐心等待。
- 第6步,根据客户端计算机的系统语言选择“仅下载以下语言的更新”,示例选择 中文(简体)
- 第7步,根据需要选择要更新的产品
注:为了测试,这里仅启用了 Windows Server 2019,全部审批后下载的补丁文件就占用了 31.6 GB
- 第8步,根据需要选择要下载的更新分类
- 第9步,设置同步计划,WSUS服务器将于指定时间向Microsoft获取更新列表,示例选择 手动同步
- 第10步,根据需要选择是否立即同步。同步只是同步更新列表,不会自动下载更新文件,经过审批之后才会下载
- 第11步,点击完成,开始同步更新列表
- 第12步,打开 Windows Server 更新服务,可以查看同步进度(同步耗时非常久,仅120个更新耗时53分钟)
4.设置 WSUS 审批和下发更新
- 第1步,打开更新服务,添加计算机组,示例添加分组 windows-2019-group
- 第2步,将未分配的计算机更改到对应的分组,示例将主机 win2019test 从默认的“未分配的计算机”调整到 windows-2019-group
- 第3步,等待更新列表同步完成,根据需要选中“未经审批”的更新,右键选择“审批”,在对应的分组选择“已审批进行安装”,点击“确定”
注:只有这里审批的更新才会被下载,审批之后会看到 wsus 服务器的网卡有大量的接收流量,说明已开始从微软官网下载更新文件。
- 第4步,在 WSUS 服务器上,查看已下载的补丁
echo # 查看已下载的补丁文件个数 #
dir d:\WindowsUpdate\WsusContent /s /b | find ".cab" /C
echo # 查看已下载的补丁文件大小 #
dir /p d:\WindowsUpdate | findstr "可用字节"
- 第5步,查看某个更新对应的补丁包文件(wsus控制台看到的一个补丁可能会包含多个补丁文件)及存放位置
- 第6步,依次点击“选项 - 自动审批”,根据需要配置自动审批规则
注:配置自动审批规则之后,更新服务会自动下载更新文件,磁盘增长会很快!建议及时关注微软官方公布的高危漏洞,推荐使用手动审批来精细的控制更新范围,并通过域控组策略统一推送及安装
5.域控配置自动更新组策略
- 第1步,以管理员身份登录域控服务器,依次选择“开始 - Windows管理工具 - 组策略管理”打开域控的组策略,新建 GPO 名为 wsus
注:运行 gpedit.msc 打开的是本地组策略,修改这里的策略不会下发到域内其他机器
- 第2步,选中 wsus 这个 GPO,右键选择“编辑”
- 第3步,打开 wsus 组策略,启用“配置自动更新”,并指定安装更新的具体时间
- 第4步,打开 wsus 组策略,启用“指定 Intranet Microsoft 更新服务位置”,并设置内部WSUS服务器的位置,示例
http://wsus:8530
- 第5步,更多的组策略设置,请参考 Windows更新策略设置
| 编号 | 策略名称 | 建议配置 | 示例 |
|---|---|---|---|
| 01 | 允许自动更新立即安装 | 已启用 | - |
| 02 | 允许非管理员接收更新通知 | 已启用 | - |
| 03 | 允许使用来自 Intranet Microsoft 更新服务位置的签名更新 | xxx | xxx |
| 04 | 始终在计划时间自动重启 | xxx | xxx |
| 05 | 自动更新检测频率 | 已启用 | 间隔(小时):22 |
| 06 | 配置自动更新 | 已启用 | 4-自动下载并计划安装,每天03:00 |
| 07 | 计划安装的延迟重启 | xxx | xxx |
| 08 | 不要在“关闭 Windows”对话框中将默认选项调整为“安装更新和关闭” | xxx | xxx |
| 09 | 不要连接到任何 Windows 更新 Internet 位置 | 已启用 | - |
| 10 | 不要在“关闭 Windows”对话框中显示“安装更新和关闭”选项 | xxx | xxx |
| 11 | 启用客户端定位 | xxx | xxx |
| 12 | 启用 Windows 更新电源管理以自动唤醒计算机来安装计划的更新 | xxx | xxx |
| 13 | 对于有已登录用户的计算机,计划的自动更新安装不执行自动重启 | xxx | xxx |
| 14 | 对计划的安装再次提示重启 | xxx | xxx |
| 15 | 重新计划自动更新计划的安装 | xxx | xxx |
| 16 | 指定 Intranet Microsoft 更新服务位置 | 已启用 | http://wsus:8530 |
| 17 | 通过自动更新启用建议的更新 | xxx | xxx |
| 18 | 启用软件通知 | xxx | xxx |
- 第6步,链接现有 GPO,添加 wsus 以使该策略下发生效
- 第7步,确认已链接
- 第8步,在域控服务器上,执行
gpupdate /force刷新组策略
gpupdate /force
- 第9步,登录已加域的任一机器,确认规则已生效,然后发起更新请求
echo ### 刷新组策略 ###
gpupdate /force
echo ### 抽样检查几个配置 ###
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUServer
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUStatusServer
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v AUOptions
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v DetectionFrequency
echo ### 强制客户端向新的更新服务器发起更新请求 ###
wuauclt /detectnow
- 第10步,通过“开始 - 设置 - 更新和安全”点击“检查更新”,可以看到已审批的更新
注:如果补丁的下载速度特别快,同时 wsus 服务器的网卡有大量的发送流量,则表示补丁已通过 wsus 下发
6.确认 WSUS 自动下发效果
- 第1步,查看配置了 WSUS 更新服务的计算机,如下示例:
xxx.com域内有2台主机配置了http://wsus:8530
- 第2步,查看某个更新需要安装的客户端数量
- 第3步,在已加域的任一机器上,通过命令行,查看已安装的更新
echo # 查看已安装的补丁清单 #
wmic qfe get HotFixID,InstalledOn
echo # 查看已安装的补丁清单 #
systeminfo | find "KB"
echo # 查看是否安装某些补丁 #
wmic qfe get HotFixID,InstalledOn | findstr "KB5066738 KB5005112 KB4577586"
- 第4步,通过“开始 - 设置 - 更新和安全”,查看本机已安装的更新
注:“卸载更新”看到的和“更新历史记录”不一致是正常的,原因是“卸载更新”显示的是可以被卸载的更新包,而“更新历史记录”显示的是所有曾尝试安装的更新活动记录,并非所有更新都可以卸载,比如更新被集成到系统中(无法也无必要单独卸载)或超过卸载期限,就会造成更新无法卸载。
- 第5步,在 WSUS 服务器上,安装 Microsoft Report Viewer 2012 可再分发组件
注:先装 Microsoft System CLR Types for SQL Server 2012,再装 Microsoft Report Viewer 2012
cd /d c:\
wget -c http://iso.sqlfans.cn/windows/win2019/Microsoft-System-CLR-Types-for-SQL-Server-2012.msi
wget -c http://iso.sqlfans.cn/windows/win2019/Microsoft-Report-Viewer-2012-Runtime.msi
start Microsoft-System-CLR-Types-for-SQL-Server-2012.msi
start Microsoft-Report-Viewer-2012-Runtime.msi
- 第6步,在批准更新后 24 小时,可使用 WSUS 报告功能来确定是否将更新部署到测试计算机组中
附录
- 参考:Microsoft - 部署 Windows Server Update Services
- 参考:Microsoft - 将 WSUS 数据库从 WID 迁移到 SQL
- 参考:Microsoft - Windows Server Update Services 最佳做法
WSUS 定期备份
- 为避免因系统崩溃或误操作丢失数据,定期备份 WSUS 服务器至关重要。确保备份包含 WSUS 数据库、更新文件、配置文件、服务器的操作系统。
- WSUS数据库:使用 SSMS 备份 WSUS 数据库,连接地址
\\.\pipe\Microsoft##WID\tsql\query(仅支持本地连接),数据目录 C:\Windows\WID\Data
:: 查看sqlserver日志
type C:\Windows\WID\Log\error.log
:: 查看sqlserver数据目录
dir C:\Windows\WID\Data
:: 查看sqlserver进程
tasklist | findstr sql
:: 安装 vc_redist_vs2010 否则sqlcmd会报错“由于找不到 MSVCR100.dll,无法继续执行代码”
http://iso.sqlfans.cn/windows/vc++/vc_redist_vs2010.x64.exe
:: 安装 ODBC Driver 11,否则sqlcmd会报错“Microsoft ODBC Driver 11 for SQL Server : 未发现数据源名称并且未指定默认驱动程序”
http://iso.sqlfans.cn/sqlserver/provider/odbc_driver_11_for_sqlserver_x64.msi
:: 打开odbc驱动程序,确保“驱动程序”中包含“ODBC Driver 11 for SQL Server”这个odbc驱动程序
C:\WINDOWS\SYSTEM32\ODBCAD32.EXE
:: 登录sqlserver实例
sqlcmd -S \\.\pipe\Microsoft##WID\tsql\query
:: 备份SUSDB数据库
use master
go
backup database SUSDB to disk = 'd:\tools\SUSDB.2025.bak' with compression
go
- 更新文件:备份存储在 WSUS 服务器上的所有更新文件,确保恢复时能够快速重新部署更新
:: 备份如下更新目录
D:\WindowsUpdate
- 配置文件:备份 WSUS 配置文件,以便在恢复时能够快速恢复到原始设置
:: 先备份所有应用程序池,再备份所有站点
%windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\apppools.xml
%windir%\system32\inetsrv\appcmd list site /config /xml > c:\sites.xml
:: 备份如下网站目录
C:\inetpub\wwwroot
C:\Program Files\Update Services\WebServices\Root
优化 WSUS 站点
- 打开IIS管理器,找到 WsusPool 应用程序池,禁用回收和配置内存限制:
| 设置名称 | 建议值 | 默认值 | 备注 |
|---|---|---|---|
| (常规) - 队列长度 | 2000 | 1000 | - |
| 进程模型 - 启用 Ping | False | True | - |
| 进程模型 - 闲置超时(分钟) | 0 | 20 | - |
| 进程模型 - 关闭时间限制(秒) | 1800 | 90 | - |
| 进程模型 - 启动时间限制(秒) | 1800 | 90 | - |
| 回收 - 固定时间间隔(分钟) | 0 | 1740 | 防止回收 |
| 回收 - 专用内存限制(KB) | 0 | 1843200 | - |
| 快速故障防护 - 已启用 | False | True | - |
调整更新的选项
- 如果要调整更新的产品或分类,可以参考下图:
- 如果要调整更新的同步计划,可以参考下图,示例改为每天 04:00 同步更新列表
遇到的问题
1.装完补丁重启报错 0x80070005
- 问题:在已加域的一台机器上安装补丁之后,点击“立即重新启动”报错 0x80070005
- 解决:通过“开始 - 电源”进行重启
echo ### 配置相关服务自动启动 ###
sc config BITS start= auto
sc config W32Time start= auto
sc config wuauserv start= auto
sc config CryptSvc start= auto
echo ### 重启相关服务 ###
net stop BITS & net start BITS
net stop W32Time & net start W32Time
net stop wuauserv & net start wuauserv
net stop CryptSvc & net start CryptSvc
echo ### 强制客户端向新的更新服务器发起更新请求 ###
wuauclt /detectnow
2.检查更新报错 0x80244022
- 问题:点击开始选择重启之后,再次检查更新报错报错 0x80244022
- 解决:登录wsus服务器,发现更新服务控制台已崩溃,重启wsus服务器即可。
3.同步更新列表超时
- 问题:第一次同步更新列表,总是失败报错“InvalidOperationException: XML 文档(1, 585)中有错误 ---> System.Net.WebException: 操作已超时”
- 解决:1.利用test-connection检测网络丢包、2.临时关闭wsus服务器的防火墙和杀毒软件、3.将wsus服务器的外发地址从移动调整到电信、4.确认企业防火墙没有限流截断、5.将wsus服务器的流量临时全放开、6.优化iis中WsusPool应用程序池、7.调整DNS服务器地址、8.配置凌晨的同步计划
4.不建议删除 SoftwareDistribution
- C:\Windows\SoftwareDistribution 用于存储 Windows 更新 的相关文件,包括更新日志和下载的补丁。发起更新任务以后,系统会将补丁文件从 wsus 服务器下载到本地 SoftwareDistribution 这个目录。若直接删除整个目录,可能会导致更新失败、无法安装补丁或更新后系统不稳定等问题
| 子目录 | 用途 | 是否可以删除 |
|---|---|---|
| Download | 临时存放从微软或wsus服务器下载的更新文件(.exe、.cab、.msu等) | 可以删除 |
| DataStore | 存储Windows更新的元数据、更新历史及操作日志 | 谨慎删除 |
| PostRebootEventCache.V2 | 存储需重启后继续执行的更新任务配置,记录未完成的更新操作(如驱动程序安装) | - |
| SLS | 存储与Windows许可证验证相关的数据,包含数字证书、激活令牌及KMS客户端配置 | 禁止手动删除 |
- 删除目录 Download 将立即释放磁盘空间,已下载但未安装的更新需重新下载
- 删除目录 DataStore 将重建空白数据库,丢失更新历史记录,但不会影响已安装的补丁,可以解决因数据库损坏导致的更新错误(如0x80070002)
- 删除目录 PostRebootEventCache.V2 可能导致未完成的更新任务被中止,系统重启后自动重建该目录
- 删除目录 SLS(Software Licensing Service)可能导致系统激活状态失效,可能触发0xC004F074等激活错误,需重新激活
结论:
- 推荐使用 DISM /Online /Cleanup-Image /StartComponentCleanup 定期清理残留
- 不建议直接删除SoftwareDistribution整个文件夹,仅清理子目录内容
net stop wuauserv
del /f /s /q %windir%\SoftwareDistribution\Download\*.*
rd /s /q %windir%\SoftwareDistribution\DataStore
net start wuauserv
5.gpo冲突导致客户端无法获取更新
- 问题:客户反馈将测试好的 wsus gpo 策略全面生效之后,其他客户端却无法获取wsus更新,刷新组策略并检查 WUServer 地址,发现配置如下:
gpupdate /force
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUServer
- 分析:经确认,目前的 wsus 生产服务器(
192.168.201.91)与域控推送的 wsus主机(192.168.220.30)的ip不一致。登录域控发现有另外一个 gpo 策略也配置了 wsus 地址(192.168.220.30),将这个 gpo 中的 wsus 配置禁用,并刷新组策略就好了。






































