An attempt was made to access a socket in a way forbidden by its access permissions 解决办法

关于 EnableExcludedPortRange 这个注册表键值,它的开启(1)禁用(0)分别代表两种完全不同的端口分配策略。我整理了一张对照表,方便你理解:

设置状态 数值 行为表现 对你的影响
开启(系统默认) 1 动态随机保留。每次重启,系统会在低端口(如 8000~9000)随机圈一块地作为系统专用。 缺点:你的 8002 随时可能被系统抽签抽中,导致报错。
优点:系统会主动为 WSL2/Docker 的虚拟网络避让低端口,减少容器网络底层冲突。
禁用(推荐修复) 0 取消随机保留。系统不再主动圈占低端口,所有端口(包括 8002)都允许普通程序监听。 优点:你的 8002 彻底解放,再也不会被随机抢走。
缺点:系统不再主动为虚拟网络避让,极少数情况下容器映射端口可能与宿主机程序产生竞争关系(竞争,但非不能用)。

📌 准备工作:以管理员身份打开终端

所有操作都必须拥有最高权限。

  1. 按键盘上的 Win + X 键。
  2. 在弹出的菜单中,点击 “终端(管理员)”“命令提示符(管理员)”
  3. 如果弹出用户账户控制(UAC)提示,点击 “是”

第一步:查看当前状态(确认问题)

在执行修改前,先看一眼系统现在的样子,方便前后对比。

复制并粘贴以下命令,按回车:

netsh interface ipv4 show excludedportrange protocol=tcp

你会看到类似这样的输出:

Start Port    End Port
----------    --------
8000          8010     <-- 如果这里包含 8002,就是它害你报错!
5000          5010
* ...

如果输出列表里确实有 8002,说明你的问题就是“随机保留”导致的。


第二步:关闭随机保留机制(核心修复)

这一步会直接解决你的报错。我们通过修改注册表,让系统别再乱圈 8002 这块地。

依次复制并执行以下 2 条命令(每条执行完按回车):

命令 1(创建注册表目录):

New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Services\hns\State" -Force

命令 2(将随机保留功能关闭,设为 0):

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\hns\State" -Name "EnableExcludedPortRange" -Value 0

(注:执行完不会有任何成功提示,这是正常的)


第三步:必须重启电脑

这一步绝对不能省略! 注册表的修改必须经过重启才能被系统内核加载生效。

关闭所有工作,重启你的 Windows 11 电脑


第四步:验证修复是否成功

电脑重启后,重新以管理员身份打开终端,再次执行第一步的查看命令:

netsh interface ipv4 show excludedportrange protocol=tcp

检查输出结果:
你会发现 8002 已经从保留列表中消失了!此时,再次启动你的程序,8002 端口应该就能顺利监听了。


🔄 附赠:万一出问题,怎么恢复原状(回滚教程)

如果你发现关闭随机保留后,WSL2 无法启动Docker 容器网络变得极其卡顿(虽然 99% 的情况下不会),可以按以下步骤一秒恢复系统默认设置:

  1. 管理员身份打开终端。
  2. 执行以下命令(把 0 改回 1,代表重新开启随机保留):
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\hns\State" -Name "EnableExcludedPortRange" -Value 1
    
  3. 再次重启电脑,系统就彻底恢复成你改之前的原始状态了。

🛠️ 终极备用方案(不关随机,只保 8002)

如果你不想动注册表,只想让系统别抢 8002 这一个端口,也可以用 netsh 手动给它加个“永久护盾”:

(以管理员身份运行)

netsh int ipv4 add excludedportrange protocol=tcp startport=8002 numberofports=1 store=persistent

(将来想删除这个护盾,把 add 换成 delete 即可)

如果执行提示:The process cannot access the file because it is being used by another process.

以管理员身份按顺序执行以下两个命令重启服务,然后再执行上述命令就可以了

net stop winnat
net start winnat

📝 总结操作清单

为了不让你看花眼,你今天只需要做这三步

  1. 管理员终端执行 Set-ItemProperty ... -Value 0
  2. 重启电脑
  3. 启动你的程序,收工。
  • 绝大多数开发者将值设为 0(禁用)后,WSL2 和 Docker 都能完美运行,几乎没有副作用。
  • 万一你真的遇到了网络异常,用我上面的回滚命令恢复即可,电脑不会因此变砖。
posted @ 2026-07-16 13:18  假装空白  阅读(10)  评论(0)    收藏  举报