PowerShell 脚本在 Windows 操作系统中同时连接外网和内网
Windows PowerShell 设置「允许同时连接内外网」完整解构文档
先厘清概念:场景分为两类,底层组件完全不同:1)多物理网卡共存(有线内网 + Wi-Fi 外网同时在线);2)VPN 场景分离隧道(Split Tunnel):接入公司 VPN 同时正常访问互联网;经常被管理员混淆的组策略项:【最小化到 Internet 或 Windows 域的连接】,控制 Windows 连接管理器(WcmSvc)是否强制断开其中一条链路。
一、核心策略定位
组策略名称
- 启用:Windows 会自动断开其中一条连接(禁止内外网同时在线)
- 禁用 / 未配置:允许同时保持多条活动网络连接
HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy
名称:fSoftDisconnectConnections
类型:REG_DWORD
0 = 禁用该策略 → 允许同时连接内外网
1 = 启用该策略 → 自动断开冲突连接
⚠️ 重要边界:这条策略只是放开 WcmSvc 的连接互斥限制;不负责路由分流。放开策略后,仍需要合理配置路由表、网卡跃点 (Metric),否则依然会出现 “只能单网通”。
二、完整调用栈树形链路
管理员 PowerShell
↓ Set-ItemProperty(操作注册表)
↓ advapi32.dll(注册表API)
↓ 写入 HKLM Policies 策略注册表
↓
WcmSvc(Windows 连接管理器服务,wcmsvc.dll)
↓ 加载策略配置,刷新连接管理规则
├─不再触发“软断开”逻辑(soft disconnect)
└─通知网络栈(tcpip.sys)允许多接口同时在线
【网络转发底层链路(路由分流)】
应用程序 Socket
↓ afd.sys Windows Socket内核驱动
↓ tcpip.sys(TCP/IP协议栈核心)
├─内核路由表(最长前缀匹配 + Metric跃点选路)
↓ ndis.sys(网络驱动抽象层)
├─物理网卡 / VPN虚拟适配器
组件分层说明
- 上层:PowerShell
无内置专用 Cmdlet;直接使用注册表命令操作策略;无独立 NetTCPIP cmdlet 对应这条 GPO。
- 策略执行层:WcmSvc(Windows Connection Manager)
服务可执行文件:
wcmsvc.dll,宿主 svchost。职责:监控网络连接状态、执行连接冲突策略;读到fSoftDisconnectConnections=1时触发自动断开。 - 网络内核层:tcpip.sys
真正执行数据包路由转发;WcmSvc 只控制连接维持,不参与路由选路。
- 持久载体:注册表 Policy 项
组策略编辑器、PowerShell 注册表操作、Intune,最终都落地到此注册表。
三、配套依赖组件清单
1)强制依赖服务
- WcmSvc(Windows 连接管理器)
关闭该服务 → 策略失效,系统不再执行连接互斥逻辑,但网络连接管理功能受损,不建议禁用。
- RpcSs(远程过程调用)
WcmSvc 依赖 RPC 完成进程间通信。
2)关键系统 DLL
- advapi32.dll:注册表读写 API
- wcmsvc.dll:WcmSvc 服务实现
- tcpip.sys:内核 TCP/IP 协议栈
- iphlpapi.dll:路由表、网卡参数配置(
New-NetRoute/Set-NetIPInterface底层依赖)
3)配套 ADMX 策略文件
C:\Windows\PolicyDefinitions\WcmSvc.admx
4)路由配置配套注册表 / 内核状态
- 设置网卡接口跃点
InterfaceMetric - 添加静态路由
New-NetRoute - VPN 场景取消【在远程网络上使用默认网关】
四、两条典型业务数据流
场景 A:PowerShell 启用策略,允许内外网共存
#管理员运行
$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy"
if(-not (Test-Path $regPath)){New-Item -Path $regPath -Force | Out-Null}
Set-ItemProperty -Path $regPath -Name fSoftDisconnectConnections -Value 0 -Type DWord
# 立即生效(无需重启,部分环境需要重连网卡)
Restart-Service WcmSvc -Force
- PowerShell 调用 advapi32 写入注册表 DWORD=0
- 重启 WcmSvc,服务加载新策略
- WcmSvc 关闭 “多连接软断开” 逻辑
- 有线、Wi-Fi、VPN 多条连接可同时保持 UP 状态
场景 B:策略放开后,路由分流完整工作流程
- 数据包发出 → afd.sys → tcpip.sys
- tcpip.sys 执行最长前缀匹配路由规则
- 同前缀多条路由对比 Metric(数值越小优先级越高)
- 匹配成功,从对应网卡发出
常见错误:只改策略,不调整路由,两张网卡都存在默认网关 0.0.0.0/0,流量随机走,表现为 “内网通外网断或者反过来”。
五、关键概念区分(极易踩坑)
1. fSoftDisconnectConnections 策略能干什么、不能干什么
2. 区分两套独立控制逻辑
- WcmSvc 连接互斥策略(本文主题)
解决:Windows 主动断网弹窗 “管理员不允许同时连接工作网络和其他网络”
- VPN Split Tunneling(分离隧道)
解决:VPN 拨号后,是否所有流量强制进入隧道;由 VPN 适配器【远程网络默认网关】控制。
六、完整配套 PowerShell 脚本(策略 + 路由基础模板)
<#
功能:1.设置组策略注册表,允许同时连接内外网
2.示范网卡跃点调整、静态路由添加(分流必备)
#>
#Requires -RunAsAdministrator
# ==========1.修改WcmSvc策略,关闭连接互斥==========
$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy"
if (-not (Test-Path $regPath)) {
New-Item -Path $regPath -Force | Out-Null
}
Set-ItemProperty -Path $regPath -Name fSoftDisconnectConnections -Value 0 -Type DWord
Write-Host "已设置:允许同时维持多条网络连接"
# 重启WcmSvc生效
Restart-Service WcmSvc -Force -ErrorAction SilentlyContinue
# ==========2.查询网卡索引(自行修改InterfaceIndex)==========
#Get-NetAdapter | Select Name,InterfaceIndex
#示例:外网Wi-Fi网卡索引=12,内网有线网卡索引=15
$ifIndex_WAN = 12
$ifIndex_LAN = 15
# 设置外网网卡更低Metric(优先互联网流量走外网)
Set-NetIPInterface -InterfaceIndex $ifIndex_WAN -InterfaceMetric 20
Set-NetIPInterface -InterfaceIndex $ifIndex_LAN -InterfaceMetric 100
# ==========3.添加内网静态路由示例(访问10.0.0.0/8走内网网卡)==========
#New-NetRoute -DestinationPrefix 10.0.0.0/8 -InterfaceIndex $ifIndex_LAN -NextHop 10.0.0.1 -PolicyStore PersistentStore
Write-Host "操作完成,请根据实际网段补充静态路由"
七、故障分层定位模型
- 报错弹窗:管理员不允许同时连接工作网络与其他网络
→ 根因:
fSoftDisconnectConnections=1;修改为 0,重启 WcmSvc。 - 策略修改成功,网卡同时在线,但只能单网访问
→ 策略层面已放行;故障在路由表冲突:双网卡同时存在默认网关,调整 Metric、清理多余默认路由、添加精确静态路由。
- 修改注册表不生效
- 未使用管理员权限;
- AD 域组策略强制推送覆盖本地注册表(域 GPO 优先级更高);
- 未重启 WcmSvc 或重连网络接口。
- VPN 接入后依旧无法上网
→ 不是 WcmSvc 策略问题;需要修改 VPN 属性:取消勾选【在远程网络上使用默认网关】(分离隧道)。
八、取证与运维拓展知识点
- 查询当前策略状态
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy" -Name fSoftDisconnectConnections -ErrorAction SilentlyContinue
- 组策略优先级顺序
域 GPO > 本地组策略 > PowerShell 直接注册表修改;域环境下单纯本地注册表会被域策略覆盖。
- Windows Home 版本
Home 无本地组策略编辑器,但注册表键依然生效,PowerShell 脚本可直接使用。
要使用 PowerShell 设置允许同时连接内外网的组策略,可以使用以下脚本:
powershell
# 设置允许同时连接内外网的组策略
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy" -Name "fSoftDisconnectConnections" -Value 0
此脚本将会在注册表中设置 HKLM\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy 下的 fSoftDisconnectConnections 值为 0,表示允许同时连接内外网。
请注意以管理员权限运行 PowerShell 脚本。这将确保你具备足够的权限来修改注册表项。
要通过 PowerShell 脚本在 Windows 操作系统中同时连接外网和内网,可以使用以下脚本:
powershell
# 获取内网网卡的接口索引
$internalInterfaceIndex = Get-NetAdapter | Where-Object { $_.InterfaceAlias -eq "<内网网卡别名>" } | Select-Object -ExpandProperty ifIndex
# 获取外网网卡的默认网关
$externalGateway = (Get-NetIPConfiguration | Where-Object { $_.InterfaceAlias -eq "<外网网卡别名>" }).IPv4DefaultGateway
# 清除默认路由
Clear-NetRoute -DestinationPrefix 0.0.0.0/0 -InterfaceIndex $internalInterfaceIndex -Confirm:$false
# 添加外网网卡的默认路由
New-NetRoute -DestinationPrefix 0.0.0.0/0 -NextHop $externalGateway -InterfaceIndex $externalInterfaceIndex
# 设置内网网卡优先级为最高
Set-NetIPInterface -InterfaceIndex $internalInterfaceIndex -InterfaceMetric 1
请将 <内网网卡别名> 和 <外网网卡别名> 替换为实际的内网网卡和外网网卡的别名。可以使用 Get-NetAdapter 命令查看所有可用的网卡别名。
运行以上 PowerShell 脚本后,Windows 操作系统将会同时连接外网和内网。脚本会清除默认路由,并添加外网网卡的默认路由。另外,还会将内网网卡的优先级设置为最高,以确保流量优先通过内网网卡。
请注意,以管理员权限运行 PowerShell 脚本。同时,注意替换为实际的网卡别名,并根据需要进行适当的调整。
通过批处理脚本实现在 Windows 操作系统中同时连接外网和内网,你可以使用以下脚本:
Copy Code
@echo off
REM 启用同时连接内外网功能
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy" /v fSoftDisconnectConnections /t REG_DWORD /d 0 /f
REM 清除默认网关
route delete 0.0.0.0
REM 添加外网网卡的默认网关
route add 0.0.0.0 mask 0.0.0.0 <外网网卡的默认网关IP>
REM 刷新组策略
gpupdate /force
请将 <外网网卡的默认网关IP> 替换为外网网卡的默认网关的实际 IP 地址。请以管理员权限运行此批处理脚本。
脚本将使用注册表设置启用同时连接内外网功能,并清除默认网关,然后添加外网网卡的默认网关作为新的默认路由。最后,使用 gpupdate /force 命令刷新组策略以使更改生效。
执行以上脚本后,Windows 操作系统将同时连接外网和内网,并根据添加的默认网关路由来实现流量的正确转发。

浙公网安备 33010602011771号