修复因防火墙故障导致的 winget 无法使用

问题

首次使用 winget,报无法注册 windows.firewall 扩展,防火墙无法启动。

相关问题

  1. https://github.com/microsoft/winget-cli/issues/4305

  2. 安装Microsoft Store应用时,系统无法注册 windows.firewall 扩展

分析

不仅是 winget 会因为防火墙故障而无法启动,其它 Microsoft Store 应用也可能遇到,说明这问题出在防火墙,而不是 winget。

经过排查发现根源是 Base Filtering Engine 服务无法启动导致。用 sc 命令可以发现,Windows Defender Firewall (mpssvc) 依赖 Base Filtering Engine (bfe),故 BFE 无法启动必然导致防火墙无法启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sc qc mpssvc
[SC] QueryServiceConfig 成功

SERVICE_NAME: mpssvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k LocalServiceNoNetworkFirewall -p
LOAD_ORDER_GROUP : NetworkProvider
TAG : 0
DISPLAY_NAME : Windows Defender Firewall
DEPENDENCIES : mpsdrv
: bfe
: nsi
SERVICE_START_NAME : NT Authority\LocalService

尝试

  1. 使用 sfc 修复几次,bfe 还是无法启动!

  2. 从另一台机器导出一份干净的 BFE 服务注册信息,导入故障机,依然无法启动。

  3. 后来想到:导入时使用的是当前用户身份,可能权限不太一样,于是检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE 下每个键的权限,发现确实是不一样的。

  4. 给 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE\Parameters 设置权限,添加用户 NT Service\BFE 即可。

参考

Base Filtering Engine (BFE)服务无法启动-CSDN博客

如果您使用微信,也可以关注公众号 UMU618,在公众号文章里评论。