我最近遭遇了某种 MFT 损坏,导致整个安装的所有权限都被清除。这使得另一个 Windows 安装无法访问该磁盘,这让我相信磁盘在某种程度上受到了损坏。我的目标不是进行“就地升级”,我知道修复 Windows 是可能的,即使它严重损坏并且对大多数用户来说完全无法使用,尤其是因为我知道问题是什么但不知道如何正确修复它。
问题症状:
- 计算机启动后,卡在旋转的点上,屏幕变黑。开机几个小时后,计算机进入睡眠状态,重新开机时,屏幕变黑,屏幕上出现光标。这是访问磁盘时出现问题的典型迹象,更具体地说,这表明系统在启动过程中无法写入磁盘(或者这是我的假设,因为我看到过磁盘 100% 已满的相同症状。我不是指在 Windows 中已满的磁盘,而是指系统处于离线状态时已满到 100% 的磁盘。)。
- 在不同的 Windows 安装中加载磁盘时,磁盘未显示已使用的存储量。如果用户尝试打开磁盘,它还会拒绝加载磁盘内容。奇怪的是,Windows 7 确实显示了磁盘的内容(也许完全阻止磁盘访问是 W8 上的一项新功能),但无法打开磁盘上的任何文件夹或文件。
- 警告磁盘上的回收站已损坏。
- 使用 icacls 重置权限后,所有 UWP 应用都无法打开,通常文本完全丢失,导致所有内容都空白,例如没有文本的对话框和没有名称的桌面图标。
经过一番折腾,我发现问题出在磁盘上的权限上,我开始检查磁盘本身的权限,结果显示无法显示所有者。将所有者更改为管理员后,我可以使用 icacls 将磁盘上的所有权限“重置”为“默认”,磁盘上的系统又可以启动了。问题是 icacls 的权限只是一些通用的默认权限,而不是普通安装所具有的实际权限。例如,UWP 不再起作用,因为它们在特殊的应用程序容器中运行,每个容器都有单独的特殊权限。.NET 和其他应用程序(如 Visual Studio)也存在许多问题,由于权限不足而无法运行。
我检查了所有能找到的日志,每次任何应用程序再次崩溃时,都会出现错误代码 5“访问被拒绝。”或“找不到文件。”或“权限被拒绝”,我预计这是同一个简单的问题的一部分。
显然,在线建议使用的指南icacls * /t /c /q /reset
适用于一般情况,但实际上并没有将权限完全重置为实际默认值。
根据我对 icacls 的理解,实际上可以备份权限并恢复它们。您可以使用以下命令来完成此操作:
icacls C:\Windows\* /save C:\WindowsAcs.txt /T
此文件包含以路径形式存储的用户权限,这些路径是使用 /save 运行 icacls 时提供的路径的相对路径。例如,如果我们提供“C:\Windows*”,它将放置所有文件夹及其完整路径,但完整路径中会删除“C:\Windows”。它还包含我认为具有权限的每个用户的 SID(安全标识符)和以下格式的属性:
D:AI(A;OICIID;FA;;;BA)(A;OICIID;0x1200a9;;;BU)(A;OICIID;FA;;;AU)
这是备份中的默认权限,其中权限是通过运行 icacls /reset 定义的。
我发现的恢复权限的第二种方法是实际“删除”系统文件夹,方法是重命名它或将其移动到垃圾或其他临时目录进行测试,然后sfc /scannow
立即运行。这会将已删除的系统文件从 WinSXS 中的默认模块中放回。如果 WinSXS 中的模块损坏,您可以使用 dism 和 /cleanup-image /restorehealth 进行修复,据我所知,这会使用来自 Microsoft 服务器的相同版本模块的副本修复组件存储。
我通过重命名C:\Windows\SystemApps
和运行 sfc 对此进行了测试。这导致 SystemApps 文件夹被重新创建,在检查了它们的权限后,它们确实完全恢复正常,根据 UWP 特定的“所有应用程序包”以及每个应用程序单独的特定应用程序包来判断。我选择这个文件夹是因为我知道容器应用程序对文件权限非常敏感,但尽管它们现在已经完全恢复,我仍然无法运行像 shell experience host 这样的应用程序,这导致开始菜单无法正常工作,这表明其他目录中一定还有其他一些库也需要特殊权限。
我现在想尝试从一台正常工作的计算机上获取这样的备份,并将其恢复到受损的系统上。这是正确的方法吗?还是有更好的方法来恢复所有权限?我可以从库存安装中获取官方权限吗?或者我是否可以通过安装或提取 wim/esd 从安装磁盘中获取它们?如果没有工具可以自动执行此过程,我可能不得不自己制作一个。
我知道组件存储(C:\Windows\WinSXS)中的系统文件有权限,那么是否可以使用命令行或其他任何方式从那里恢复所有权限?