网站搜索

Windows 更新客户端故障排除指南


Windows 更新是 Windows 客户端和服务器操作系统的关键组件。它们保证 Windows 的安全并且应该是自动的。但是,当您发现自己需要清除 Windows 更新缓存或处理“Windows 更新客户端未能检测到错误”时,这种自动性质很快就会发生变化。

在本文中,您将学习在客户端级别对 Windows 更新进行故障排除。您将了解 Windows 更新的工作原理(高级)、如何使用日志执行基本故障排除以及如何修复常见的 Windows 更新问题。

先决条件

为确保本教程涵盖的所有步骤都适用于您,请确保您具备以下条件:

  • Windows 7+ 或 Windows Server 2012+ 计算机 - 本教程中使用的演示环境运行的是 Windows 10 Build 1909,但 Windows 7(可能还有早期版本)也可以运行。
  • 以管理用户身份登录 Windows。您需要以管理员身份运行一些命令。

Windows 更新代理 (WUA)

当涉及到 Windows 更新问题时,罪魁祸首是 Windows 更新代理。代理负责协调检测、下载和安装更新。该代理负责协调 Windows 更新服务 (wuauserv),它是一个 DLL 库,位于 C:\Windows\System32 中,名为 wuaueng.dll 。

有时,在 Windows 8.1/Windows Server 2012 及更早版本的操作系统上,需要将代理更新到更高版本。尽管更新代理不太常见且没有必要,但如果您运行的是较旧的操作系统,则应确保它运行最新的代理版本。

要检查计算机上安装的代理版本:

  1. 打开 Windows 文件资源管理器。
  2. 导航至C:\Windows\System32 文件夹。
  3. 找到 wuaueng.dll 文件,右键单击它并转到属性。
  4. 在属性窗口中,单击详细信息选项卡,如下所示。 WUA 版本将是文件版本。

通常,对于 Windows 10 及更高版本,WUA 将始终为最新版本。但为了确定这一点,请务必查看 Microsoft 文档。

如何修复 Windows 更新问题

我们不再向您提供有关 Windows 更新的更多背景知识,而是直接讨论实际问题。让我们介绍一下如何清除 Windows 更新缓存并可能修复您收到的许多烦人的“Windows 更新客户端无法检测到错误”错误消息。

重现问题并检查 Windows 更新日志

要解决计算机上的任何问题,您必须能够重现它。追查随机出现的问题可能是有史以来最烦人的任务之一。

在更改计算机上的任何内容之前,您应该首先调用完整的更新过程。此更新过程将检测可用更新,并且根据您是否设置了自动下载和安装,还将下载并安装更新。

要在 Windows 10 上启动更新过程:

  1. 单击“开始”菜单并输入powershell。
  2. 右键单击Windows PowerShell,然后单击以管理员身份运行。
  3. 在 PowerShell 控制台中,创建一个新的 AutoUpdate COM 对象并调用 DetectNow() 方法。 PowerShell 使您能够以编程方式访问 AutoUpdate COM 对象,以调用启动 Windows Update 代理的方法。
(New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()

4. 您可以看到 AutoUpdate COM 对象还有其他方法,这些方法可能会在以后派上用场。

如果您运行的是 Windows 8.1/Server 2012 或更早版本,您还可以将 Windows Update 客户端 (C:\Windows\System32\wuauclt.exe) 与 /detectnow 开关结合使用。但从 Windows 10 开始,PowerShell 已取代了此开关。

当您运行上述 PowerShell 命令时,您应该不会得到任何输出。你怎么知道它做了什么?检查 Windows 更新日志。

5. 仍在 PowerShell 中运行 Get-WindowsUpdateLog 命令。此命令收集所有 Windows 更新事件并在当前目录中创建一个 WindowsUpdate.log 文本文件。

Windows 10 使用 Windows 事件跟踪 (ETW) 来生成诊断日志。您无法再直接读取 C:\Windows\System32\WindowsUpdate.log 日志文件。

6. 检查WindowsUpdate.log 文件,您应该会看到类似于下面的几行。这些行指示 WUA 何时启动。从这里向下滚动并注意是否发现任何问题。

确认关键服务已启动

Window Updates 依赖于四个 Windows 服务才能正常运行:

  • 后台智能传输服务(BITS)
  • Windows 更新服务
  • 加密服务
  • Windows安装程序

如果上述任何服务被停止(不包括 Windows Installer),更新将无法工作。

要检查重要服务,请使用 Windows 服务管理器选项或使用 PowerShell。由于您可能已经打开了 PowerShell,所以让我们走这条路。

要检查每个服务的状态,请使用 Get-Service PowerShell 命令,如下所示。

Get-Service -Name wuauserv,bits,cryptsvc

请注意,下面这两个服务的 Status 均为 Running。如果您没有看到此内容,则需要启动它们。

要启动服务,请按键盘上的向上箭头调出最后一个命令,然后将 Start-Service 命令添加到末尾,如下所示。

Get-Service -Name wuauserv,bits,cryptsvc | Start-Service

清除 Windows 更新缓存

如果服务正在运行,但您在自动更新方面仍然遇到问题,则需要清除 Windows 更新缓存。当 Windows 下载并安装更新时,它会下载元数据,有时会缓存每个更新的二进制文件。

根据您对“缓存”的定义,您可以对此方法应用不同级别的侵入性。您应该从干扰最小的开始并再次测试。如果您仍然遇到问题,请继续执行下一个故障排除步骤。

删除 Qmgr DAT 文件

清除 Windows 更新缓存的侵入性最小的方法之一是从 %ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader 文件夹中删除所有 qmgr 文件。但首先,您必须停止上述所有适用的服务。

Get-Service -Name wuauserv,bits,cryptsvc | Stop-Service

停止所有服务后,运行以下命令:

Remove-Item -Path "$env:ALLUSERSPROFILE\Application Data\Microsoft\Network\Downloader\qmgr*.dat"

在尝试删除 qmgr 文件时,您可能会收到一条错误消息,指出“该进程无法访问该文件,因为该文件正在被另一个进程使用”。如果是这样,请重新启动计算机并重试。如果错误仍然存在,请在安全模式下重新启动 Windows,然后重试。

PowerShell 应删除所有缓存更新。完成后,再次启动服务并祈祷吧!

Get-Service -Name wuauserv,bits,cryptsvc | Start-Service

走向核:重置 Windows 更新缓存

如果上述步骤没有帮助,那么是时候进行核处理了。是时候将整个 Windows 更新缓存系统完全重置回默认设置了。

“窗口更新缓存”实际上并不是一个组件;而是一个组件。它是组件的组合。在上面的部分中,您只是操作服务和文件系统。 Windows Update 还在注册表中进行设置并注册许多不同的 DLL 文件。

现在让我们逐步了解可用于重置 Windows 更新缓存的 PowerShell 脚本,该脚本将进行任何必要的注册表修改、删除任何缓存的更新,并处理 Windows Server 更新服务 (WSUS) 的一些常见问题。

要运行以下脚本:

  1. 单击开始菜单并输入 ise。
  2. 右键单击PowerShell ISE,然后单击以管理员身份运行。
  3. 单击查看,然后单击显示脚本窗格。此操作应该会打开一个可以在其中编写脚本的位置。
  4. 将以下脚本复制到脚本窗格中。
Write-Host 'Stopping all necessary services…'
Get-Service -Name wuauserv,bits,cryptsvc,msiserver | Stop-Service

Write-Host 'Removing all qmgr.dat files…'
Remove-Item -Path "$env:ALLUSERSPROFILE\Application Data\Microsoft\Network\Downloader\qmgr*.dat"

Write-Host 'Backing up Windows Update cache folders…'
Rename-Item -Path "$env:SYSTEMROOT\SoftwareDistribution\DataStore" -NewName 'DataStore.bak'
Rename-Item -Path "$env:SYSTEMROOT\SoftwareDistribution\Download" -NewName 'Download.bak'
Rename-Item -Path "$env:SYSTEMROOT\System32\catroot2" -NewName 'catroot2.bak'

Write-Host 'Resetting BITS and Windows Update services security descriptors…'
$null = Start-Process -FilePath 'sc.exe' -ArgumentList 'sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)'
$null = Start-Process -FilePath 'sc.exe' -ArgumentList 'sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)'

Write-Host 'Re-registering all requisite DLLs…'
$dlls = @(
     'atl.dll'
     'urlmon.dll'
     'mshtml.dll'
     'shdocvw.dll'
     'browseui.dll'
     'jscript.dll'
     'vbscript.dll'
     'scrrun.dll'
     'msxml.dll'
     'msxml3.dll'
     'msxml6.dll'
     'actxprxy.dll'
     'softpub.dll'
     'wintrust.dll'
     'dssenh.dll'
     'rsaenh.dll'
     'gpkcsp.dll'
     'sccbase.dll'
     'slbcsp.dll'
     'cryptdlg.dll'
     'oleaut32.dll'
     'ole32.dll'
     'shell32.dll'
     'initpki.dll'
     'wuapi.dll'
     'wuaueng.dll'
     'wuaueng1.dll'
     'wucltui.dll'
     'wups.dll'
     'wups2.dll'
     'wuweb.dll'
     'qmgr.dll'
     'qmgrprxy.dll'
     'wucltux.dll'
     'muweb.dll'
     'wuwebv.dll'
)
foreach ($dll in $dlls) {
    regsvr32.exe "$env:SYSTEMROOT\System32\$dll" /s
}

Write-Host 'Removing WSUS registry values…'
@('AccountDomainSid','PingID','SusClientId','SusClientIDValidation') | ForEach-Object {
     Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" -Name $_ -ErrorAction Ignore
}

## Resets computer group membership
Write-Host 'Resetting WSUS client cookie..,'
$null = wuauclt.exe /resetauthorization

Write-Host 'Starting all necessary services…'
Get-Service -Name wuauserv,bits,cryptsvc | Start-Service

Write-Host 'Initiating update cycle…'
(New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()
Write-Host 'Windows Update reset complete.'

5. 单击文件 —> 保存并将脚本保存在计算机上的某个位置。本教程假设它位于C:\FixWindowsUpdates.ps1中。

6. 单击 PowerShell ISE 中的绿色三角形以运行脚本。

如果您更喜欢 GUI,您还可以找到执行类似步骤的工具。但是,我无法确认它涵盖了上面 PowerShell 脚本中给出的完全相同的步骤。

结论

要在 Windows 计算机的后台自动下载和安装必要的更新,需要协调许多任务。尽管您可能会遇到数十种不同的错误消息,但您在本指南中学到的提示和脚本应该可以帮助您修复几乎所有错误消息。

相关文章