拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows共享服务抢占IP修复记录

Windows共享服务抢占IP修复记录

修复 Windows 网络共享(ICS)把192.168.137.1钉死在断开网卡上,导致无法分配给目标网卡“以太网 2”的问题。


问题所在

这台电脑曾开启过 Windows 网络共享(ICS),它把网关地址192.168.137.1固定分配给了内置网卡“以太网”(该网卡没插线,处于断开状态)。因此:

  • 想把192.168.137.1设到 USB 网卡“以太网 2”时,系统报“对象已存在”,分配失败;
  • “以太网 2”拿不到地址,只能自我分配169.254.x.x的无效地址;
  • 重启电脑也无效,因为 ICS 服务开机又会把地址钉回“以太网”。

解决步骤(已完成)

  1. 诊断:确认SharedAccess(ICS)服务在运行,192.168.137.1被它占在断开的“以太网”上;
  2. 释放地址:Remove-NetIPAddress强制从“以太网”移除残留 IP(直接分配、重启网卡均无效,因为 ICS 会立刻抢回);
  3. 重新分配:netsh interface ip set address name=25 static 192.168.137.1 255.255.255.0,成功设到“以太网 2”;
  4. 验证:192.168.137.1状态Preferred,开发板192.168.137.76ping 通。

本机网卡信息

⚠️ifIndex 因机器而异,换机先重查。

网卡ifIndex说明
以太网23内置 Intel I219-V,未插线,ICS 残留占用192.168.137.1
以太网 225Realtek USB 网卡,目标网卡(连接开发板)
WLAN13Wi-Fi 上网网卡(ICS 共享的出口)

netsh的name=参数同时接受网卡名和 ifIndex,用 ifIndex 可避免脚本中中文网卡名的编码问题。


诊断指令

# 查看网卡与 ifIndex、连接状态Get-NetAdapter|Format-Table-AutoSize ifIndex,Name,Status,InterfaceDescription# 查看各网卡 IPv4 地址及状态(重点看 AddressState 是否为 Deprecated)Get-NetIPAddress-AddressFamily IPv4|Format-Table-AutoSize InterfaceAlias,IPAddress,PrefixLength,PrefixOrigin,AddressState,InterfaceIndex# 经典方式查看全部网卡配置(对应 ipconfig /all)netsh interface ipv4 show config# 确认 ICS(SharedAccess)服务是否在运行Get-ServiceSharedAccess|Format-Table-AutoSize Name,Status,StartType# 查询 ICS 固定占用的网关地址Get-ItemProperty'HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters'|Format-ListScopeAddress,ScopeAddressBackup

判断要点

目标 IP 出现在其他网卡(哪怕已断开)且AddressState = Deprecated,加上SharedAccess = Running、ScopeAddress = 192.168.137.1,即可确认是ICS 钉住的残留地址——这正是netsh报“对象已存在”的根源。


无效路径(踩坑记录,避免重复尝试)

# ① 直接分配 → 报“对象已存在”netsh interface ipsetaddress name=25 static 192.168.137.1 255.255.255.0# ② 把残留网卡改回 DHCP → ICS 立刻又把 192.168.137.1 分回去netsh interface ipsetaddress name=23 dhcp# ③ 禁用/启用残留网卡 → ICS 依旧重新抢占Disable-NetAdapter-InterfaceIndex 23-Confirm:$falseStart-Sleep-Seconds 4Enable-NetAdapter-InterfaceIndex 23-Confirm:$false

以上三种方式全部无效:SharedAccess服务每次都会主动把ScopeAddress重新分配到它绑定的网卡上。


有效修复指令(核心,需管理员权限)

# ① 强制移除"以太网"(ifIndex=23) 上的残留 IP —— 唯一有效的释放方式Remove-NetIPAddress-InterfaceIndex 23-IPAddress 192.168.137.1-Confirm:$false# ② 立即将 IP 分配给"以太网 2"(ifIndex=25),不给 ICS 抢回的时间窗口netsh interface ipsetaddress name=25 static 192.168.137.1 255.255.255.0# ③ 清除"以太网 2"上遗留的静态 DNS(残留过 192.168.137.1 的指向)Set-DnsClientServerAddress-InterfaceIndex 25-ResetServerAddresses
  • ①②两步必须连续执行;
  • 等价的 PowerShell 原生写法:New-NetIPAddress -InterfaceIndex 25 -IPAddress 192.168.137.1 -PrefixLength 24。

验证指令

# 确认"以太网 2"已持有 192.168.137.1 且状态为 PreferredGet-NetIPAddress-InterfaceIndex 25-AddressFamily IPv4|Format-Table-AutoSize InterfaceAlias,IPAddress,PrefixLength,AddressState# 确认"以太网"已回落到正常的 169.254 自动地址Get-NetIPAddress-InterfaceIndex 23-AddressFamily IPv4-ErrorAction SilentlyContinue# 连通性测试(对端设备 IP 按实际替换)ping 192.168.137.76

预期结果:以太网 2 =192.168.137.1/24(Preferred),ping 全部回复、0% 丢包。


一键修复脚本(自动重试版)!!!

保存为fix_ip.ps1,以管理员身份运行:

# fix-ics-ip.ps1 - auto-detect version, MUST run as Administrator# Fixes: target IP stuck on a stale adapter (ICS-held), "object already exists" error# Usage:# .\fix-ics-ip.ps1 (defaults: 192.168.137.1 / Realtek USB)# .\fix-ics-ip.ps1 -TargetIP 192.168.137.1 -TargetDescPattern "Realtek USB"param([string]$TargetIP='192.168.137.1',[string]$TargetDescPattern='Realtek USB')# --- 1. Locate target adapter by hardware description (ifIndex is NOT stable across reboots) ---$target=Get-NetAdapter|Where-Object{$_.InterfaceDescription-like"*$TargetDescPattern*"}|Select-Object-First 1if(-not$target){Write-Host"[ERROR] No adapter matching '*$TargetDescPattern*'. Available adapters:"-ForegroundColor RedGet-NetAdapter|Format-TableifIndex,Name,Status,InterfaceDescription-AutoSizeexit1}Write-Host"[INFO] Target adapter:$($target.Name)(ifIndex=$($target.ifIndex))"# --- 2. Release the IP from any OTHER adapter that currently holds it (ICS re-grabs, so retry) ---for($round= 1;$round-le3;$round++){$holders=Get-NetIPAddress-IPAddress$TargetIP-ErrorAction SilentlyContinue|Where-Object{$_.InterfaceIndex-ne$target.ifIndex}if(-not$holders){break}foreach($hin$holders){Write-Host"[FIX ] Round$round: removing$TargetIPfrom '$($h.InterfaceAlias)'"Remove-NetIPAddress-InterfaceIndex$h.InterfaceIndex-IPAddress$TargetIP-Confirm:$false-ErrorAction SilentlyContinue}Start-Sleep-Seconds 2}# --- 3. Assign to target adapter + reset stale DNS ---netsh interface ipsetaddress name=$($target.ifIndex)static$TargetIP255.255.255.0 2>&1|Out-NullStart-Sleep-Seconds 3Set-DnsClientServerAddress-InterfaceIndex$target.ifIndex-ResetServerAddresses-ErrorAction SilentlyContinue# --- 4. Verify ---$ok=Get-NetIPAddress-InterfaceIndex$target.ifIndex-AddressFamily IPv4-ErrorAction SilentlyContinue|Where-Object{$_.IPAddress-eq$TargetIP-and$_.AddressState-ne'Deprecated'}if($ok){Write-Host"[ OK ]$TargetIPis now on '$($target.Name)' (Preferred)"-ForegroundColor Green}else{Write-Host"[FAIL] IP not assigned. Current state:"-ForegroundColor RedGet-NetIPAddress-InterfaceIndex$target.ifIndex-AddressFamily IPv4-ErrorAction SilentlyContinue|Format-TableInterfaceAlias,IPAddress,AddressState-AutoSize}

使用方法

# 管理员 PowerShell 中运行(默认目标:192.168.137.1 / Realtek USB 网卡).\fix_ip.ps1# 或显式指定参数.\fix_ip.ps1-TargetIP 192.168.137.1-TargetDescPattern"Realtek USB"

实际调试

以太网适配器 以太网: 媒体状态............: 媒体已断开连接 连接特定的 DNS 后缀.......: 以太网适配器 以太网 2: 连接特定的 DNS 后缀.......: 本地链接 IPv6 地址........: fe80::a7f4:3de0:3973:9eb3%25 自动配置 IPv4 地址.......: 169.254.4.194 子网掩码............: 255.255.0.0 默认网关.............:PSC:\system-patch\ics>.\fix_ip.ps1-TargetIP 192.168.137.1-TargetDescPattern"Realtek USB"[INFO]Target adapter: 以太网 2(ifIndex=25)[FIX ]Round 1 : removing 192.168.137.1from'以太网'[OK]192.168.137.1 is now on'以太网 2'(Preferred)以太网适配器 以太网 2: 连接特定的 DNS 后缀.......: 本地链接 IPv6 地址........: fe80::a7f4:3de0:3973:9eb3%25 IPv4 地址............: 192.168.137.1 子网掩码............: 255.255.255.0 默认网关.............:

普通终端提权运行(弹 UAC 确认):

Start-Processpowershell-Verb RunAs-Wait-ArgumentList `'-NoProfile -ExecutionPolicy Bypass -File "D:\完整路径\fix-ics-ip.ps1"'

回滚命令(恢复原状)

# "以太网 2"恢复 DHCP 自动获取netsh interface ipsetaddress name=25 dhcp# PowerShell 等价写法Set-NetIPInterface-InterfaceIndex 25-Dhcp EnabledRemove-NetIPAddress-InterfaceIndex 25-IPAddress 192.168.137.1-Confirm:$false

防复发

在图形界面完成一次:

  1. Win+R→ncpa.cpl
  2. 右键WLAN→ 属性 →共享选项卡
  3. 勾选“允许其他网络用户通过此计算机的 Internet 连接来连接”
  4. 家庭网络连接下拉框选“以太网 2”→ 确定

完成后 ICS 的192.168.137.1由系统自动维护在“以太网 2”上,重启不再复发;对端设备将网关和 DNS 指向192.168.137.1即可通过电脑共享上网。


经验教训

  • PowerShell 5.1 中文乱码:运行含中文的.ps1会按 ANSI 读取导致乱码报错——脚本内用ifIndex代替中文网卡名(本次因此将name="以太网 2"改为name=25);
  • “对象已存在”排查:netsh报该错时,先用Get-NetIPAddress全局查该 IP 是否挂在其他网卡上(包括已断开的网卡);
  • ICS 钉住的地址:改 DHCP、禁用/启用网卡都无效,只有Remove-NetIPAddress强制移除成功。
返回列表