参考文章:

前言

作为一个喜新厌旧的孩子,自然系统更新少不了,最近微软发布了Win1122h2(其实早就有了,旧电脑早就更新了新电脑不行)。

旧电脑体验了一番,发现22H2的颜值(主要是)以及Bug都得到了不少改进(不过有点卡),还有云母标题栏,标签资源管理器,心动了。

于是回来之后就给新电脑尝试升级,结果:

我就在网上撒网似的搜索错误代码,无非就是(尤其是水透了的MSCommunity):

1
2
3
4
sfc /scannow
DISM /Online /Cleanup-Image /CheckHealth
DISM /Online /Cleanup-image /ScanHealth
DISM /Online /Cleanup-Image /RestoreHealth

还有用工具(易升、安装助手),干净启动等等的。

看到MSCommunity上最先进的解决方案:

依然没用qwq。

解决方式

然并卵,都没用。于是我便自寻出路。

错误示范

受到了他人的启发,我先生成了windows更新日志文件,在Powershell管理员模式里面输入:

1
Get-WindowsUpdateLog

然后我看了看日志,搜索了一些关键词,比如warn,fail等等的,并没有什么发现。

正确示范

又受到MSCommunity上的人启发,看了看事件查看器。

事件查看器的打开也很简单,只需要Win+R输入eventvwr即可。

如果你要暴力查找,显然时间复杂度是很高的,最坏情况下是O(n),对于计算机来说,搜索非常简单,而对于人来说,就有点吃力了。

要真的想快点找到事件的话,我们可以使用筛选功能:

wuserv对应的事件来源便是WindowsUpdateClient,筛选出来它,我们就能看到我们想要的日志了

然后我们只需要找到错误就可以进行剖析了。

俗话说的好,一个巴掌拍不响,祸不单行。一般来说很多情况下错误都是有好几个的,不如找一个易于查找的错误代码。

然后我突然发现:除了开始的0x8007001f以外,还有一个:

网上一搜,便有了结果:

  1. Windows更新缓存问题
  2. Windows Search服务问题
  3. 部分服务问题
  4. WinRE损坏

然后我发现我的WinRE是损坏的:

损坏使用reagentc /info来检测

实际上损坏是因为我换电脑时因为嫌麻烦进行过迁移,于是WinRE没了(PS为什么之前都行)

于是,我就参考这篇文章进行了修复。

如何修复?

修复并不麻烦,首先,你需要一个WinRE镜像,一般来说大部分Windows11版本的WinRE都是一样的,刚好手里因为更新有一个22H2镜像,所以直接拷贝镜像里面的install.wim/Windows/System32/Recovery即可。

拷贝到C:\Recovery\Windows下,如果没有则新建(默认是系统保护文件夹,所以需要开启显示)。

我遇到了一个棘手的问题:拒绝访问。

这时我们需要对文件夹进行提权。

提权稍微复杂一点,需要自己仔细看看。(everyone图方便不建议用)




这时就能正常访问了,把install.wim扔进去。

然后Powershell管理员输入:

1
2
reagentc /setreimage /path C:\Recovery\WindowsRE
reagentc /enable

MSC的大佬帮助

这样就好了吗?

并没有好,好不容易进入重启更新阶段了,结果直接蓝屏回退。

这时,我在MSCommunity的帖子收到了回复:

刚好遇到了一个神犇,非常厉害,我把错误日志发给他,他就给了我一段修复代码,我复制到PowerShell里面,重启,更新成功!

原帖地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
$arch = Get-WMIObject -Class Win32_Processor -ComputerName LocalHost | Select-Object AddressWidth

Write-Host "1. Stopping Windows Update Services..."
Stop-Service -Name BITS
Stop-Service -Name wuauserv
Stop-Service -Name appidsvc
Stop-Service -Name cryptsvc

Write-Host "2. Remove QMGR Data file..."
Remove-Item "$env:allusersprofile\Application Data\Microsoft\Network\Downloader\qmgr*.dat" -ErrorAction SilentlyContinue

Write-Host "3. Renaming the Software Distribution and CatRoot Folder..."
Rename-Item $env:systemroot\SoftwareDistribution SoftwareDistribution.bak -ErrorAction SilentlyContinue
Rename-Item $env:systemroot\System32\Catroot2 catroot2.bak -ErrorAction SilentlyContinue

Write-Host "4. Removing old Windows Update log..."
Remove-Item $env:systemroot\WindowsUpdate.log -ErrorAction SilentlyContinue

Write-Host "5. Resetting the Windows Update Services to defualt settings..."
"sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)"
"sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)"

Set-Location $env:systemroot\system32

Write-Host "6. Registering some DLLs..."
regsvr32.exe /s atl.dll
regsvr32.exe /s urlmon.dll
regsvr32.exe /s mshtml.dll
regsvr32.exe /s shdocvw.dll
regsvr32.exe /s browseui.dll
regsvr32.exe /s jscript.dll
regsvr32.exe /s vbscript.dll
regsvr32.exe /s scrrun.dll
regsvr32.exe /s msxml.dll
regsvr32.exe /s msxml3.dll
regsvr32.exe /s msxml6.dll
regsvr32.exe /s actxprxy.dll
regsvr32.exe /s softpub.dll
regsvr32.exe /s wintrust.dll
regsvr32.exe /s dssenh.dll
regsvr32.exe /s rsaenh.dll
regsvr32.exe /s gpkcsp.dll
regsvr32.exe /s sccbase.dll
regsvr32.exe /s slbcsp.dll
regsvr32.exe /s cryptdlg.dll
regsvr32.exe /s oleaut32.dll
regsvr32.exe /s ole32.dll
regsvr32.exe /s shell32.dll
regsvr32.exe /s initpki.dll
regsvr32.exe /s wuapi.dll
regsvr32.exe /s wuaueng.dll
regsvr32.exe /s wuaueng1.dll
regsvr32.exe /s wucltui.dll
regsvr32.exe /s wups.dll
regsvr32.exe /s wups2.dll
regsvr32.exe /s wuweb.dll
regsvr32.exe /s qmgr.dll
regsvr32.exe /s qmgrprxy.dll
regsvr32.exe /s wucltux.dll
regsvr32.exe /s muweb.dll
regsvr32.exe /s wuwebv.dll

Write-Host "7) Resetting the WinSock..."
netsh winsock reset
netsh winhttp reset proxy

Write-Host "8) Delete all BITS jobs..."
Get-BitsTransfer | Remove-BitsTransfer

Write-Host "9) Starting Windows Update Services..."
Start-Service -Name BITS
Start-Service -Name wuauserv
Start-Service -Name appidsvc
Start-Service -Name cryptsvc

Write-Host "10) Forcing discovery..."
wuauclt /resetauthorization /detectnow

Write-Host "Process complete. Please reboot your computer."

再次感谢这位神犇。

(MSCommunity中文区也不是一无是处啊)