最近朋友的服务器遇到一个问题,那就是无法通过以下文章提到的方法修复系统,包括离线修复的也不行:《使用DISM工具在线修复Windows》《使用DISM命令及Windows安装镜像,离线修复Windows 10/11 系统》



以上的修复过程,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 各版本。