无法通过常规的 DISM、SFC 修复方法修复系统,但通过非常规的方法解决了

当觉得 Windows 10 / Windows 11 操作系统出现文件丢失或损坏的情况,先不要急着重装系统,可以考虑一下使用DISM工具。具体的操作方法(需要联网使用):
1、以管理员的权限运行命令提示符或Powershell;
2、在命令提示符或Powershell下面依次执行以下指令:
DISM.exe /Online /Cleanup-image /Scanhealth
DISM.exe /Online /Cleanup-image /Restorehealth
3、等待操作过程结束。修复结束后,建议重启电脑。
如果还是不放心的,可以在重启电脑之后再以管理员权限打开命令提示符或Powershell,执行以下指令:
sfc /scannow
但最近朋友的服务器遇到一个问题,那就是无法通过以上内容提到的方法修复系统,包括离线修复的也不行。
图片
在线修复报错,错误代码:0x800f0906
图片
离线修复报错,错误代码:0x800f081f
图片
执行 sfc /scannow 提示无法修复

以上的修复过程,dism工具会把详细的记录写到 C:\windows\logs\DISM\dism.log 和 C:\windows\logs\CBS\CBS.log 文件里面,sfc 工具会把修复记录写到 C:\windows\logs\CBS\CBS.log 里面(本文假设系统盘为 C:),因此通过查看这些文件,大致可以了解是哪个部分无法修复,或者知道是什么原因导致无法修复。于是笔者就尝试在 C:\windows\logs\DISM\dism.log 搜索错误代码:0x800f081f,然后会找到一个提示:Error in operation: source for package or file not found ,翻译过来的意思就是:操作错误:未在指定的源中找到软件包或文件,也就是说在我们指定的修复源文件中,找不到相关的文件或软件包。

图片
不过,dism.log 文件里面未详细指出是哪个组件的源文件找不到,因此我们还需要到 C:\windows\logs\CBS\CBS.log 文件里找,可以通过查看 dism.log 文件中出现错误代码的时候所在的时间,然后在 CBS.log 文件里面看看对应的时间前后产生了哪些事件,大致就可以找出相关的答案。

图片
从上面截图框住的地方中可以看出,需要修复的文件是“C:\Windows\WinSxS\amd64_updateservices-webservices-client_31bf3856ad364e35_10.0.14393.4046_none_73ad56bd5627c862\Web.config”,但在笔者指定的修复源中,并没有提供这个版本的文件,因此无法执行修复。文件的名称来看,这个应该是 Windows Server 更新服务(WSUS)的文件。知道是什么问题之后,我们可以换一个思路,就是找到另一台版本相同并且安装有 Windows Server 更新服务的操作系统,确保该系统的 C:\Windows\WinSxS 目录可以被网络上需要修复的服务器访问,作为新的修复源,然后执行以下命令:

dism /online /cleanup-image /restorehealth /source:\\修复源服务器的IP\修复源目录 /limitaccess
比如,修复源服务器相关目录的访问路径是:\\192.168.1.1\C$\Windows\WinSxS,则命令为:

dism /online /cleanup-image /restorehealth /source:\\192.168.1.1\C$\Windows\WinSxS /limitaccess
如果找不到其它同版本系统的服务器的,可以在虚拟机中安装相同版本的服务器系统,然后利用虚拟机中的系统作为修复源,执行修复(前提是需要修复的服务器可以访问虚拟机系统内的修复源目录)。

另外,既然知道了是哪个文件需要修复,还可以考虑从其它电脑中把健康的、可信的同目录同名文件,复制到文件受损的电脑上。

话说回来,笔者朋友看到是哪个文件受损之后,好像回忆起了一些事情,跟笔者说:“这个文件我好像修改过,当时是为了提升 Windows Server 更新服务的网络性能,修改后作用不明显,但忘记了把文件还原过去了。”听了之后,笔者忍不住给了他一个犀利的眼色:“你这小子,尽是做些莫名其妙的事情……”

注意:以上的处理过程虽然是在 Windows Server 下进行,实际上也适用于 Windows 客户端操作系统,包括 Windows 8/10/11 各版本。

正文完
 0