PowerShell 脚本在 Windows 操作系统中同时连接外网和内网

Windows PowerShell 设置「允许同时连接内外网」完整解构文档

先厘清概念:
 
场景分为两类,底层组件完全不同:
 
1)多物理网卡共存(有线内网 + Wi-Fi 外网同时在线);
 
2)VPN 场景分离隧道(Split Tunnel):接入公司 VPN 同时正常访问互联网;
 
经常被管理员混淆的组策略项:【最小化到 Internet 或 Windows 域的连接】,控制 Windows 连接管理器(WcmSvc)是否强制断开其中一条链路。

一、核心策略定位

组策略名称

路径:
 
计算机配置 → 管理模板 → 网络 → Windows 连接管理器
 
策略名称:最小化到 Internet 或 Windows 域的连接
  • 启用:Windows 会自动断开其中一条连接(禁止内外网同时在线)
  • 禁用 / 未配置允许同时保持多条活动网络连接
对应注册表(GPO 最终落地载体)
plaintext
HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy
名称:fSoftDisconnectConnections
类型:REG_DWORD
0 = 禁用该策略 → 允许同时连接内外网
1 = 启用该策略 → 自动断开冲突连接
PowerShell 修改本质:直接操作策略注册表键值;本地组策略编辑器读取同一条注册表。
⚠️ 重要边界:
 
这条策略只是放开 WcmSvc 的连接互斥限制不负责路由分流。放开策略后,仍需要合理配置路由表、网卡跃点 (Metric),否则依然会出现 “只能单网通”。

二、完整调用栈树形链路

plaintext
管理员 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虚拟适配器

组件分层说明

  1. 上层:PowerShell
     
    无内置专用 Cmdlet;直接使用注册表命令操作策略;无独立 NetTCPIP cmdlet 对应这条 GPO。
  2. 策略执行层:WcmSvc(Windows Connection Manager)
     
    服务可执行文件:wcmsvc.dll,宿主 svchost。
     
    职责:监控网络连接状态、执行连接冲突策略;读到 fSoftDisconnectConnections=1 时触发自动断开。
  3. 网络内核层:tcpip.sys
     
    真正执行数据包路由转发;WcmSvc 只控制连接维持,不参与路由选路
  4. 持久载体:注册表 Policy 项
     
    组策略编辑器、PowerShell 注册表操作、Intune,最终都落地到此注册表。

三、配套依赖组件清单

1)强制依赖服务

  1. WcmSvc(Windows 连接管理器)
     
    关闭该服务 → 策略失效,系统不再执行连接互斥逻辑,但网络连接管理功能受损,不建议禁用。
  2. 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)路由配置配套注册表 / 内核状态

策略放开只是 “允许同时在线”;想要流量正确分流,还需要:
  1. 设置网卡接口跃点 InterfaceMetric
  2. 添加静态路由 New-NetRoute
  3. VPN 场景取消【在远程网络上使用默认网关】

四、两条典型业务数据流

场景 A:PowerShell 启用策略,允许内外网共存

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
时序拆解:
  1. PowerShell 调用 advapi32 写入注册表 DWORD=0
  2. 重启 WcmSvc,服务加载新策略
  3. WcmSvc 关闭 “多连接软断开” 逻辑
  4. 有线、Wi-Fi、VPN 多条连接可同时保持 UP 状态

场景 B:策略放开后,路由分流完整工作流程

  1. 数据包发出 → afd.sys → tcpip.sys
  2. tcpip.sys 执行最长前缀匹配路由规则
  3. 同前缀多条路由对比 Metric(数值越小优先级越高)
  4. 匹配成功,从对应网卡发出
常见错误:只改策略,不调整路由,两张网卡都存在默认网关 0.0.0.0/0,流量随机走,表现为 “内网通外网断或者反过来”。

五、关键概念区分(极易踩坑)

1. fSoftDisconnectConnections 策略能干什么、不能干什么

✅ 能干:阻止 Windows 主动断开第二条网络连接
 
不能自动处理路由分流;不能自动分配流量走对应网卡
 
不是 VPN 分离隧道开关;VPN 分离隧道由 VPN 配置文件 / 路由控制,和这条策略相互独立

2. 区分两套独立控制逻辑

  1. WcmSvc 连接互斥策略(本文主题)
     
    解决:Windows 主动断网弹窗 “管理员不允许同时连接工作网络和其他网络”
  2. VPN Split Tunneling(分离隧道)
     
    解决:VPN 拨号后,是否所有流量强制进入隧道;由 VPN 适配器【远程网络默认网关】控制。

六、完整配套 PowerShell 脚本(策略 + 路由基础模板)

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 "操作完成,请根据实际网段补充静态路由"

七、故障分层定位模型

  1. 报错弹窗:管理员不允许同时连接工作网络与其他网络
     
    → 根因:fSoftDisconnectConnections=1;修改为 0,重启 WcmSvc。
  2. 策略修改成功,网卡同时在线,但只能单网访问
     
    → 策略层面已放行;故障在路由表冲突:双网卡同时存在默认网关,调整 Metric、清理多余默认路由、添加精确静态路由。
  3. 修改注册表不生效
    • 未使用管理员权限;
    • AD 域组策略强制推送覆盖本地注册表(域 GPO 优先级更高);
    • 未重启 WcmSvc 或重连网络接口。
  4. VPN 接入后依旧无法上网
     
    → 不是 WcmSvc 策略问题;需要修改 VPN 属性:取消勾选【在远程网络上使用默认网关】(分离隧道)。

八、取证与运维拓展知识点

  1. 查询当前策略状态
powershell
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WcmSvc\GroupPolicy" -Name fSoftDisconnectConnections -ErrorAction SilentlyContinue
  1. 组策略优先级顺序
     
    域 GPO > 本地组策略 > PowerShell 直接注册表修改;域环境下单纯本地注册表会被域策略覆盖。
  2. 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 操作系统将同时连接外网和内网,并根据添加的默认网关路由来实现流量的正确转发。


 

posted @ 2023-07-12 22:21  suv789  阅读(768)  评论(0)    收藏  举报