NOTE · Engineering Systems

Windows 与 WSL:可回滚的系统排障备忘

整理 Python 启动别名、WSL、网络驱动器、占用文件和系统空间的安全诊断方法。

注册表托盘开关、OOBE 绕过、旧 netsh firewall、递归接管权限等做法不可泛化。本文只推荐能回滚、能验证的排障路径。

Win 键、托盘和首次启动

下面几个短问题应先从可验证的设置排查,不提供未经核验的注册表配方:

  • Win 键失效:先检查键盘的 Win-lock/游戏模式、硬件模式开关、屏幕键盘、另一把键盘和键盘管理软件,再检查系统快捷键。不要先改注册表。
  • NVIDIA App 不出现在托盘:从 NVIDIA App 自身设置、Windows“启动应用”和托盘图标显示状态检查。修改 nvlddmkmNVTrayShowInSedonaStartOnLogin 的值没有版本或来源依据,驱动升级也可能覆盖,因此这里只作为历史现象记录。

NVIDIA NVTray 注册表截图,仅用于辨认历史现象

这张截图不构成修改注册表的建议;没有确认驱动版本、值的语义和可回滚备份时,不应照图修改。

  • Windows 首次启动联网要求OOBE\BYPASSNRO 属于会随构建和组织策略变化的绕过方式,不作为当前部署指南。个人机器和组织设备分别按当前微软 OOBE/Autopilot 文档处理。

Python 命令打开 Microsoft Store

先确认命令解析到了哪里:

Get-Command python -All
where.exe python
py -0p

如果结果指向 WindowsApps 的应用执行别名,而机器上另有真实 Python,可在“设置 → 应用 → 高级应用设置 → 应用执行别名”中检查 python.exe / python3.exe,或使用 Python Launcher:

py -3 --version

不要靠复制另一个目录里的 python.exe 修复 PATH。

WSL 状态与恢复

wsl --status
wsl --version
wsl --list --verbose

温和重启 WSL 虚拟机:

wsl --shutdown

在迁移或修复发行版前先导出备份:

wsl --export DISTRO_NAME D:\Backups\DISTRO_NAME.tar

wsl --unregister 会删除发行版及其数据,不属于普通排障步骤;本文不提供“先删再试”的流程。

\\wsl.localhost 无法访问,应先检查发行版是否运行、WSL 服务状态和资源情况,而不是修改共享权限:

wsl --list --running
wsl --distribution DISTRO_NAME --exec df -h

把 WSL 副本迁到非系统盘

官方支持 --export / --import。安全做法是先导入为新名字并验证,不急着注销原发行版:

wsl --shutdown
wsl --export DISTRO_NAME D:\Backups\DISTRO_NAME.tar
Get-FileHash D:\Backups\DISTRO_NAME.tar -Algorithm SHA256
wsl --import DISTRO_NAME_MOVED D:\WSL\DISTRO_NAME_MOVED D:\Backups\DISTRO_NAME.tar --version 2
wsl --list --verbose
wsl --distribution DISTRO_NAME_MOVED

在新副本中检查普通用户、home、项目文件、包、systemd/服务和网络,再单独决定默认发行版与旧副本。--import 的发行版可能默认进入 root,需要按该发行版文档设置默认用户。

wsl --unregister 会永久删除原发行版的数据和配置;仅有一个 tar 文件并不等于备份已经可恢复。必须确认哈希、成功导入并抽查重要文件后,才考虑该破坏性操作。参见 Microsoft:WSL 基本命令

常见错误码不是一键修复结论

  • 0x80072EE2 通常表示请求超时,继续区分 Store/Windows Update、DNS、代理、TLS 和防火墙;
  • 0x80070002 表示系统找不到指定文件,结合触发命令、发行版注册状态、事件日志和实际 VHDX/路径定位;
  • \\wsl.localhost 报资源不足时,先看发行版是否运行、宿主机内存/磁盘和 WSL 日志,不通过修改共享 ACL 绕过。

先保存完整错误和 wsl --statuswsl --versionwsl --list --verbose 输出,再查与当前 WSL 版本对应的官方 issue/文档。

文件或移动硬盘“正在使用”

先关闭位于该盘上的文件、终端、编辑器和媒体库。再用任务管理器/资源监视器查找相关句柄;需要更细信息时可使用微软 Sysinternals Process Explorer 或 Handle。

不要用强制拔盘验证猜测。确认写入完成、文件系统无活动后,再从系统托盘安全弹出。

资源监视器的“关联的句柄”或 Sysinternals Process Explorer/Handle 能按盘符、路径搜索占用者。系统索引、杀毒扫描、终端当前目录和编辑器文件监视都可能持有句柄;关闭具体程序比结束 Explorer 或强制离线磁盘更安全。

权限提示

先查看当前 ACL:

icacls "C:\PATH\TO\TARGET"

“需要来自某用户的权限”不等于应递归取得整个目录的所有权。系统目录、应用目录和其他用户目录的 ACL 有明确用途。只有确认目标是自己的数据、已有备份且理解继承范围时,才在图形界面修改所有者或权限。

不把“Administrators 完全控制整个目录树”作为通用删除方法。

网络驱动器

查看现有映射:

net use

删除已经确认不再使用的映射:

net use DRIVE_LETTER: /delete

DRIVE_LETTER 是占位符。删除映射不会删除服务器数据,但正在使用该盘符的程序会失去连接。

局域网共享异常时补充检查:

Get-SmbConnection
Get-SmbMapping
Test-NetConnection SERVER_HOST -Port 445

Windows 10/11 与当前 Samba 通常使用 SMB2/SMB3,不应为访问旧设备就全局启用 SMB1。先确认服务器协议、账号、共享权限、文件 ACL 和凭据管理器中的旧凭据。删除本地账户前也应先迁出其桌面、文档、浏览器资料、加密文件和应用数据。

端口被占用

Get-NetTCPConnection -State Listen |
  Sort-Object LocalPort |
  Select-Object LocalAddress, LocalPort, OwningProcess

定位具体端口:

Get-NetTCPConnection -LocalPort PORT_NUMBER |
  Select-Object LocalAddress, LocalPort, State, OwningProcess
Get-Process -Id PROCESS_ID

确认进程身份和服务关系后,再决定改端口、停止服务或退出应用。不要因为看到 PID 就直接强制结束。

网络与防火墙

Get-NetIPConfiguration
Get-NetRoute
Test-NetConnection SERVER_HOST -Port PORT_NUMBER
Get-NetFirewallProfile

netsh firewall set icmpsetting type=all mode=enable 会使用过时接口并放宽整个 ICMP 范围,已删除。需要测试 ICMP 时,应在 Windows Defender 防火墙高级安全中创建边界明确、可命名、可删除的入站规则,并限制配置文件和来源地址。

“一台能 ping 另一台、反向不通”通常是两端防火墙配置、网络 Profile、路由或 ICMP 策略不对称,并不自动说明网卡坏了。Ping 也不等价于应用端口可达;继续用 Test-NetConnection 测目标服务端口。

UDP 广播收不到时确认发送地址、端口、绑定接口、子网边界、防火墙和虚拟网卡。广播通常不会跨路由器转发;不要通过关闭全部防火墙来证明代码“没问题”。

远程桌面只应为当前网络 Profile 和明确来源开放规则。微软 Wi-Fi Direct Virtual Adapter 被系统功能使用时,设备管理器中直接禁用可能影响无线显示、热点等功能;先确认实际依赖。

Everything 索引

下面两条操作仍然有效:

  • 手动重扫文件夹索引:Tools → Options → Folders → Rescan All Now
  • 同一结果出现两份时,检查是否把已由 NTFS 索引覆盖的卷又加入 Folder Index。移除重复的 Folder 条目,不删除真实文件。

对离线移动硬盘,强制全量重建可能暂时把不可用目录显示为空;连接并确认盘符后再重扫。当前菜单与原理见 voidtools 官方排障页

Alt+Tab、截图和 Windows Spotlight

  • Alt+Tab 是否显示 Edge 标签页由 Windows 多任务设置控制;如果只想切换应用窗口,在当前系统设置中把标签页数量改为“不显示标签页”。
  • 截图工具的自动保存位置和开关会随 Windows 版本变化,先从 Snipping Tool 设置和“图片/屏幕截图”目录确认,不靠第三方注册表脚本。
  • Windows Spotlight 是动态下载内容。若只是想固定喜欢的锁屏图,优先从“设置 → 个性化 → 锁屏界面”切换为图片并选择自己已保存的文件;不要依赖内部缓存文件名长期不变。
  • 记事本显示、下划线和输入异常先用纯文本、另一字体和输入法复现,区分渲染、格式和输入法,不替换系统字体。

电池报告

旧链接可由系统自带命令替代:

powercfg /batteryreport /output "%USERPROFILE%\Desktop\battery-report.html"

报告中的 Design Capacity、Full Charge Capacity 和使用历史是估算与固件上报,不是一次测量就能证明电芯健康。结合多个充放电周期、异常关机和厂商诊断判断。命令定义见 Microsoft powercfg 文档

pagefile、hiberfil 与系统空间

pagefile.syshiberfil.sys 是系统管理文件,不应在资源管理器中强删。先查看休眠和睡眠能力:

powercfg /a

关闭休眠会同时影响依赖休眠文件的功能,具体边界见《Windows 睡眠、休眠与电源计划》。虚拟内存则优先保留系统管理,只有在明确工作负载、崩溃转储和磁盘约束后才调整。

Windows 上 pip 缓存、UE 派生数据缓存等目录也可能占空间。先用对应工具查看和清理策略,不用目录联接偷偷搬走仍在写入的缓存。确需迁移大型应用目录时,使用本博客 mklink /J 的备份、校验和回滚流程,并优先使用应用官方提供的缓存位置设置。

工具安装类旧链接的处理

Visual Studio、CUDA、SWIG、FFmpeg 和 VMware 的安装入口都应使用各自官方发行页并记录版本;过时的 CSDN 教程与 Windows 7 虚拟机修补步骤不应作为当前建议。多 CUDA 版本是否能共存不仅由目录决定,还涉及驱动、PATH、编译器和项目环境,最好由 Conda、容器或构建脚本隔离。

浏览器疑似劫持时检查扩展、搜索引擎策略、快捷方式目标、代理、DNS、计划任务和安全软件报告;不要下载名字叫“一键修复”的未知工具。

不建议的高风险做法

  • 修改未记录来源的 NVIDIA 注册表值;
  • 绕过 Windows 首次启动联网流程;
  • 全局放宽 ICMP 或防火墙;
  • 递归取得任意目录所有权和完全控制;
  • 从别的电脑复制系统 OpenSSH 文件;
  • 无证据的浏览器劫持、驱动和 VM “一键修复”链接;
  • 支持未核实注册表改动的旧截图,以及与正文无关的身份页脚。

Win 键、Everything、WSL 迁移和电池报告等安全主题仍可按上文的受支持方式处理。

参考资料与书签

以下 48 条仅作为历史检索入口。第三方注册表、权限接管、防火墙、系统文件删除、旧驱动、虚拟机和缓存迁移教程可能不适用于当前 Windows;先查当前微软或软件厂商文档、建立备份和回滚点,不要直接照抄。