用途与实际影响
这项功能怎样使用
为什么需要它
系统代理、环境变量、Git 与路由表各自保存状态。只修其中一处可能仍然断网;盲目删默认路由又可能雪上加霜。因此主入口先判断活监听与 TUN,再对每类配置分别决定保留、清理或拒绝动作。
举个实际例子
“代理退了,网页还报连接旧代理失败。”我在首页点检查并修复,先看到失效设置的中文预览;确认后才关闭指向死端口的系统代理并清理相关用户/Git 设置。界面分别显示配置回读与微软基础网页结果;旧终端可能要重开。
最后我会得到什么
窗口逐项告诉我哪些失效代理设置已清、哪些仍在工作的设置被保留、旧网络路线是否因为缺少安全退路而没有动,以及基础网页是否真的打开。
正常时
确认失效的本机设置已清,仍在工作的代理保持原样;设置与网页测试分别报告,旧终端可能要重开。
发现问题时
找不到可靠的物理上网路线时,所有默认路线都保持原样;其他可安全处理的设置仍按预览逐项说明。
入口不可用或证据不足时
需要删除系统路线却没有管理员权限时停止这一步,明确提示如何在同一用户的管理员窗口继续。
从哪里开始
双击根目录“00-打开 ProxyClean.vbs”,在首页点“检查并修复上网问题”,读中文预览后才点“开始修复”。
需要准备什么
- 网页或命令行出现的故障
- 是否还需要正在运行的代理
- 预览后是否同意执行
从开始到拿到结果
- 1
先检查
窗口读取系统代理、端口和路由;仍活着的代理路径会保留。
- 2
预览后修复
只对预览中符合失效条件的配置保存原值并修改;没有可修项时不强行清理。
- 3
回读并试网页
回读实际设置并测试微软基础网页;失败或其他应用仍断网时看明确未处理范围,必要时用撤销恢复本轮可逆设置。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
物理默认路由保护已修复;隔离回归通过,真实网络未改动关键规则与设计选择
不写入新的代理端点。默认只清失效本地项,Direct也仅处理手动WinINET、用户代理变量、来源明确的通用全局Git代理和满足物理回退条件的IPv4残留路由。
删除候选默认路由前必须至少看到一条 HardwareInterface=true、Up、NextHop 非零且非 fake-ip 的物理默认路由;否则本轮不删除任何路由。
系统代理仅在指向的本地端口已死或显式传 -Direct 时才关闭;活代理只在默认模式交由客户端维护。
PInvoke(平台调用)广播 WM_SETTINGCHANGE(超时 200ms)与 InternetSetOption 负责通知配置变化;已经运行的进程仍可能需要重开才能取得新的用户环境变量。
本模块用到的名词
- Orphan Route Precondition(孤儿路由前置条件)
- 在删除候选默认路由前,源码要求至少存在一条 HardwareInterface=true、Up、NextHop 非零且非 fake-ip 的物理默认路由;它明确要求 Windows 标记为物理接口,仍不等于主动测得网关或公网可达。
- Direct Mode(强制直连模式)
- 显式 -Direct 会关闭 WinINET、清空列出的用户代理变量并 unset Git 代理,即使值仍活跃或指向远程;它不结束客户端进程或切 TUN。
- Loopback Dead Discrimination(本地死端口鉴别)
- 严格区分 127.0.0.1 本地回环与远程代理服务器,只清已死的本地端口,避免误伤正常的远程代理配置。
专业定义
区分本地死端口、活代理与远程配置;PInvoke(平台调用)负责通知,清理后分别回读路由和连通性
解决什么
防止代理崩溃后因残留系统代理和孤儿 fake-ip 路由导致全机断网,防止网络修复工具误删物理路由引发二次灾难。
当前怎样实现
- User32Sig 声明 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 'Environment', timeout(等待超时)=200ms)。
- WinINet 声明 InternetSetOption(SETTINGS_CHANGED 39, REFRESH 37)。
- Test-PortAlive 通过 IPGlobalProperties.GetActiveTcpListeners 严格检验回环与通配地址监听状态。
- Test-HealthyPhysRoute 检查网卡 Status 为 Up 且 NextHop 非 0.0.0.0 且非 198.18/198.19 fake-ip 网段。
- Test-LocalProxyDead 解析代理端点,仅在全部端点为本地回环且无活跃监听时才断定为死代理。
- Test-HealthyPhysRoute在删除前与删除后共同检查HardwareInterface=true;信息未知不充当物理路由证据。
- ProxyClean.Operations.ps1在效果前将原值和步骤存入当前用户DPAPI保护的last-operation.dpapi;临写比较preimage,写后回读,失败逆序恢复。外来修改保留为recovery_required并阻止新配置写入;只处理当前轮可撤销对象,文件不是跨设备恢复包。
执行流程
- 1
读取 WinINET 注册表与 Get-NetAdapter,检测系统代理发布端口与处于 Up 状态的 fake-ip TUN 路由。
- 2
依据现场判定目标:默认模式若有 WinINET 活端口或活动 TUN 就保留活路径,仅清死项;两者同时存在只告警。传 -Direct 则清空列出的代理设置,但仍不结束客户端进程或切 TUN。
- 3
执行默认路由条件扫描:备用候选少于 1 条就跳过全部删除;否则处理已消失/Down 网卡路由与直连目标下的 fake-ip 默认路由。
- 4
逐项审计用户环境变量与 Git 代理,判定为本地死端口则清空为直连,调用 User32 广播变更。
- 5
审计 WinINET 系统代理:若开着却指向死端口,则将 ProxyEnable 置 0 关停恢复直连。
- 6
仅在命令行显式 -FlushDns 或维护窗口明确选择时刷新 DNS;普通修复不会自动执行。配置变更仍通知 WinINET。
- 7
GUI 已确认修复后回读配置,并单独请求微软基础测试网页;脚本化探测与公网出口比较各按入口说明,网页成功不证明所有应用直连。
边界
- 若当前没有符合源码谓词的备用默认路由,无论是否指定 -Direct,本轮都不删除任何路由条目。
- Direct不是所有应用直连保证:PAC、WinHTTP、机器变量、URL专属/含糊Git配置、Docker与其他应用不隐式修改;混合映射中的其他端点保留。
- NO_PROXY 环境变量包含用户白名单配置,脚本绝对不碰、不清空。
- 普通用户权限下无法修改系统内核路由表,必须提升为管理员才能执行路由删除动作。
失败与恢复
- 现场没有符合条件的备用默认路由
- 脚本打印黄色警告并跳过全部路由删除,提示先确认 WLAN 或以太网;其余代理配置清理仍按各自条件继续。
- 系统代理指向的端口正在正常监听
- 脚本认定为活动代理,不关闭系统代理,仅提示交由客户端维护,保持现场不动。
- 默认模式下 Git 代理同时包含有效远程代理与本地死端口
- 默认保留无法安全定位的配置,Direct也不越过Git来源边界;先明确可写的通用全局配置,不删除含糊或URL专属项。
- WinINET 活端口与活动 fake-ip TUN 同时存在
- 默认模式只告警多路径,不替用户选择或关闭客户端;用户先决定保留哪一条,或明确选择 -Direct。
真实入口
ProxyClean.ps1主清理脚本,实现死端口鉴别、候选孤儿默认路由条件处理与系统广播
ProxyClean.test.ps1自动化测试套件,验证回环解析与死端口逻辑
如何验证
- ProxyClean.test.ps1 验证本地/远程/混合代理解析、活/死本地端口、隔离 Git 配置和只读状态 JSON。
- 2026-09-24 来源记录 12 项新增注册表回归及整仓 193 项通过;9 月 22 日隔离客户端流程验证保留原日期。两者都未在本人当前网络关闭代理,也不证明公网或所有应用恢复。
- 源857b110的新增回归包含9个判定场景与3个实际清理条件分支:只有虚拟备用时零删除、活动TUN保留、Direct模式下符合条件的孤儿清理。旧实现先失败,新实现双PowerShell通过。
与其他模块的关系
首页“检查并修复上网问题”的配置修复核心,也是命令行默认清理与显式直连的技术依据;普通修复不自动刷新 DNS。
