Skip to content

Latest commit

 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ipmg - 网络设备IP一键配置工具

一个 Windows 命令行 TUI 工具,专为网络工程师设计,用于一键切换网卡的 IP 配置以对接不同管理网段的网络设备(交换机、路由器、防火墙、AP、AC 等)。

本项目完全由Vibe Coding完成(Model:DeepSeek V4 Flash 正式版 | Tool:Codex)。

目录

背景

网络工程师在日常运维中,经常需要将笔记本电脑的网卡 IP 改到设备管理网段(如 10.251.251.x),登录设备 Web 管理页面完成配置后,再改回原来的 IP。这个过程频繁且繁琐:

  1. 打开"控制面板 → 网络连接 → 属性 → IPv4 → 手动填写 IP/掩码/网关"
  2. 浏览器输入设备管理地址
  3. 操作完成后又要改回 DHCP 或原来的静态 IP

ipmg 将这个流程简化为一个数字选择:

选择网卡 → 选择设备 → 一键配置 → 自动Ping验证 → 打开管理页面

操作完成后一键恢复原始 IP,全程不超过 10 秒。

功能特性

功能 说明
一键配置 IP 选择网卡和设备,自动计算网卡 IP 并配置静态地址
一键恢复 IP 自动备份操作前的 IP 配置,完成后一键恢复(DHCP 或静态)
多级撤销恢复 备份栈保存最近10次操作前配置,可撤销恢复到任意历史版本
设备分组管理 设备可按分组/站点组织展示,支持设置分组、新建分组
IP历史记录恢复 支持恢复最近10条历史IP配置,自动去重,固定DHCP选项
设备搜索 支持按名称、IP模糊搜索设备,快速定位目标设备
设备管理 添加、编辑、删除、收藏常用设备配置,分组展示
自动 Ping 验证 配置完成后自动 Ping 设备验证连通性
管理页面直达 配置完成后直接打开设备 Web 管理页面
网卡状态实时显示 标题栏显示当前选中网卡的 IP、掩码、网关、DHCP/静态状态
断开网卡支持 未接线的网卡也会显示,可配置静态 IP(恢复 DHCP 需要接线)
配置导入导出 YAML 格式,方便团队共享设备配置(导入时严格校验,损坏文件拒绝导入)
管理员自动提权 启动时自动检测权限,非管理员自动 UAC 提权
操作日志 所有操作自动记录到日志文件,便于审计排查
交互优化 统一选择组件:关键字即时过滤、↑/↓键盘导航、c<编号>复制、统一确认对话框
用户设置 设置菜单集中管理交互偏好(自动开页面、虚拟网卡过滤、动作钩子)
虚拟网卡过滤 网卡列表默认隐藏 VMware/Hyper-V/WSL/蓝牙等虚拟网卡,可在设置中关闭
动作钩子 配置/恢复成功后自动执行自定义命令,便于对接通知与自动化
版本更新检测 启动时后台检测 GitHub(或镜像站)最新版本,标题栏提醒,可一键打开 Release 页面
配置前预检 配置 IP 前检查 IP 冲突、网关网段、设备可达性,错误项阻止、警告项提示
原子保存+自动备份 配置写入采用原子替换并保留上一版 .bak,异常时不损坏原配置
配套配置编辑器 独立 GUI 工具(tkinter),可视化编辑本地配置文件

更新日志

v1.3

  • 版本更新检测:启动时后台检测 GitHub(或镜像站)最新版本,标题栏提醒;主菜单新增"检查更新"(快捷键 u),可打开 Release 页面;可在设置中关闭或指定镜像地址
    • "检查更新"无论是否有新版本,均展示 GitHub 最新版本与本地版本(含完整版本号)
  • 配置前预检:配置 IP 前检查本机 IP 冲突、ARP 冲突、网关网段、设备可达性,错误项阻止配置、警告项提示后继续
  • 配置原子保存与自动备份:写入改为临时文件 + 原子替换,并保留上一版 config.yaml.bak,异常时原配置不受影响
  • 配套配置可视化编辑器(GUI,tkinter):独立程序 ipmg-config-editor,可打开/编辑/保存本地配置(设备、设置、网卡记忆、备份与历史),校验与主程序一致,损坏文件拒绝打开
  • 版本号集中管理(core/version.py),设置 schema(SETTING_SCHEMA)由 TUI 设置页与 GUI 编辑器共用

v1.2

  • 统一交互组件 ui/widgets.py:选择菜单支持关键字即时过滤、Windows 终端 ↑/↓/j/k 键盘导航、c<编号> 复制到剪贴板、统一确认对话框(危险操作默认拒绝)
  • 主菜单改为动作注册表驱动,新增功能只需注册一条 Action 即可获得菜单入口
  • 新增设置界面:自动打开管理页、虚拟网卡过滤、配置/恢复成功后执行命令(钩子)
  • 网卡列表默认过滤虚拟网卡(VMware、Hyper-V、WSL、蓝牙等),可在设置中关闭
  • 配置流程合并"选设备方式"步骤:设备列表直接支持关键字过滤,确认步骤精简为一行
  • 成功路径不再强制"按回车返回",结果在标题栏展示;配置失败时可按 r 直接进入恢复流程
  • 主菜单记忆上次动作并默认高亮;s 进设置、q 退出快捷键
  • WMI 错误码附带解决建议(如 84=网卡未连接、97=IP 已被占用)
  • 配置 schema 引入 version 字段与迁移框架,旧配置自动无损迁移
  • 业务逻辑抽离为 core/operations.py,为 CLI 无头模式与自动化测试铺路

v1.1

  • 新增设备分组/站点管理,设备列表按分组展示,支持设置分组、新建分组
  • 新增多级撤销栈:每次配置 IP 前自动备份,可恢复到任意历史备份版本
  • 新增 IP 历史记录恢复与设备模糊搜索(名称 / IP)
  • 恢复 IP 界面合并展示 DHCP、撤销栈、历史记录三个来源
  • 修复多项问题:
    • UAC 提权被取消时不再静默退出,而是提示后继续运行;路径含空格也能正确提权重启
    • 撤销恢复失败时备份栈保持不变,可重试,不再丢失备份记录
    • 配置文件中出现异常条目(如 devices: [null])不再导致启动崩溃
    • 子网掩码 0.0.0.0 会被拒绝,不再触发全量地址遍历导致程序卡死
    • 导入损坏或格式错误的配置文件会中止并保留现有配置,不再静默覆盖
    • Ping 校验改为匹配 ICMP Echo Reply 的 type/ID,避免误判;修复 socket 泄漏
    • 设备管理菜单回车默认选中第一个设备

界面预览

主菜单

========================================
     网络设备IP一键配置工具 v1.3
========================================
  当前网卡: 以太网 2 (08:26:AE:3B:68:20)
  IP 地址 : 192.168.1.100 / 255.255.255.0  [DHCP]  网关: 192.168.1.1
----------------------------------------

请选择操作
-------------------------------------------------------
 > 1. 配置IP - 选择网卡和设备,一键配置
   2. 恢复IP - 恢复网卡IP配置(含历史记录与撤销)
   3. 管理设备 - 添加/编辑/删除设备(支持分组)
   4. 导出配置
   5. 导入配置
   6. 设置 - 交互偏好与钩子
   7. 检查更新 - 检测GitHub最新版本
   8. 退出
-------------------------------------------------------
请输入序号 (1-8), s=设置, u=检查更新, q=退出:

配置流程

正在获取网卡列表...

请选择网卡
-------------------------------------------------------
   1. [USB] 以太网 2 | 已连接 | IP: 192.168.1.100 | MAC: 08:26:AE:3B:68:20
 > 2. [以太网] 以太网 | 未连接 | 无IP | MAC: AA:BB:CC:DD:EE:FF  <-- 上次
   0. <-- 返回上一页
-------------------------------------------------------

已选网卡: 以太网 2 | 请选择设备
-------------------------------------------------------
 > 1. [*] 核心交换机 | 设备: 10.251.251.251 | -> 网卡IP: 10.251.251.254 [Web]
   2. [ ] 防火墙 | 设备: 192.168.0.1 | -> 网卡IP: 192.168.0.254 [Web]
   0. <-- 返回上一页
-------------------------------------------------------

--- 配置确认 ---
  网卡:     以太网 2 (08:26:AE:3B:68:20)
  设备名称: 核心交换机
  设备IP:   10.251.251.251
  网卡将配置IP: 10.251.251.254
  子网掩码: 255.255.255.0

确认执行配置?(Y/n): y

正在备份网卡IP...
[OK] 网卡IP备份成功
正在配置网卡IP为 10.251.251.254...
[OK] IP配置成功

正在Ping设备 10.251.251.251 验证连通性...
[OK] 设备 10.251.251.251 可达

管理页面: https://10.251.251.251
按 1 打开管理页面,按其他键返回: 1
[OK] 管理页面已打开

快速开始

方式一:直接运行 exe(推荐)

  1. 下载 ipmg.exe
  2. 双击运行(会自动弹出 UAC 提权确认)
  3. 首次运行选择"管理设备"添加你的设备信息
  4. 之后选择"配置IP"即可一键切换

配套的 ipmg-config-editor.exe 是配置可视化编辑器(GUI),可打开/编辑/保存 %USERPROFILE%\ipmg\config.yaml,适合批量维护设备与设置。

方式二:从源码运行

# 克隆项目
git clone https://github.com/DX-Cloud/ipmg.git
cd ipmg

# 安装依赖
pip install -r requirements.txt

# 以管理员身份运行(需要管理员权限操作网卡)
python main.py

使用指南

配置IP流程

完整的配置流程包含以下步骤:

  1. 选择网卡 — 列出所有物理网卡(含未连接的),上次使用的网卡会标记"上次"
  2. 选择设备方式 — 可选择"显示全部设备"或"搜索设备"
  3. 选择设备 — 从设备列表中选择,收藏的设备标有 *
  4. 确认配置 — 显示网卡、设备IP、将要配置的网卡IP、子网掩码等信息
  5. 自动备份 — 自动备份当前网卡的 IP 配置
  6. 执行配置 — 通过 WMI 设置静态 IP
  7. Ping 验证 — 自动 Ping 设备检查连通性
  8. 打开管理页面 — 可选择直接打开设备的 Web 管理页面

设备搜索功能

在配置IP流程中,支持按关键词搜索设备:

已选网卡: 以太网 2 | 请选择设备
-------------------------------------------------------
   1. 显示全部设备
   2. 搜索设备(输入关键词)
   0. <-- 返回上一页
-------------------------------------------------------

若选择搜索:
请输入搜索关键词(支持设备名称、IP模糊匹配):
关键词: 交换

搜索结果: 2 条匹配
-------------------------------------------------------
   1. [*] 核心交换机 | 设备: 10.251.251.251 | -> 网卡IP: 10.251.251.254
   2. [ ] 接入交换机 | 设备: 192.168.1.1 | -> 网卡IP: 192.168.1.254
   0. <-- 返回上一页
-------------------------------------------------------

搜索特性:

  • 支持设备名称模糊匹配(如"交换"可匹配"核心交换机"、"接入交换机")
  • 支持设备IP模糊匹配(如"251"可匹配"10.251.251.251"、"192.168.251.1")
  • 不区分大小写
  • 搜索结果为空时可重新搜索或返回

恢复IP流程

  1. 选择网卡 — 显示所有网卡,选择要恢复IP的网卡
  2. 选择恢复方式 — 显示恢复选项列表:
    • 第一项固定为 "恢复为 DHCP(自动获取)"
    • 随后显示撤销栈中的备份版本(每次配置 IP 前的状态,可多级撤销)
    • 最后显示最近10条静态IP历史记录(IP/掩码/网关/时间戳)
  3. 确认恢复 — 确认后执行恢复
  4. 执行恢复 — DHCP 模式调用 EnableDHCP,静态模式调用 EnableStatic

IP历史记录恢复

恢复IP界面示例:

请选择要恢复的IP配置
-------------------------------------------------------
   1. 恢复为 DHCP(自动获取)
   2. [撤销] 192.168.1.100/255.255.255.0  网关: 192.168.1.1  [2024-01-15 14:30:00]
   3. [撤销] DHCP  [2024-01-15 10:20:00]
   4. [历史] 10.251.251.254 / 255.255.255.0  网关: 无  [2024-01-14 16:45:30]
   0. <-- 返回上一页
-------------------------------------------------------

历史记录特性:

  • 每次配置IP前,自动将当前静态IP保存到历史记录
  • 最多保存10条历史记录,超出自动删除最旧的
  • 相同IP配置(IP+掩码+网关)自动合并,更新时间戳
  • DHCP配置不记录到历史(有专门的DHCP选项)
  • 历史记录按网卡MAC分别存储

撤销栈特性:

  • 每次配置 IP 前自动备份当前配置(DHCP 或静态),最多保留 10 条
  • 选择某一撤销版本时,自动跳过其上的中间版本,直接恢复到目标版本
  • 撤销失败(如网卡断开)时备份栈保持不变,可重新尝试

设备管理

支持以下操作:

  • 添加设备 — 输入设备名称、IP、子网掩码、网关、管理URL
  • 编辑设备 — 修改已有设备的任意字段
  • 删除设备 — 确认后删除
  • 收藏/取消收藏 — 收藏的设备在列表中标记 *
  • 设置分组 — 可将设备加入已有分组或新建分组,列表按分组展示
  • 分组浏览 — 配置 IP 时可按分组浏览全部设备,也可直接搜索

导入导出

  • 导出 — 将当前所有设备配置导出为 YAML 文件
  • 导入 — 从 YAML 文件导入设备配置(会覆盖当前配置)
  • 导入前会严格校验文件结构与字段类型,损坏或格式错误的文件会中止导入,现有配置不受影响

配置文件详解

配置文件存放在 %USERPROFILE%\ipmg\config.yaml

C:\Users\<用户名>\ipmg\
├── config.yaml              # 设备配置、网卡记忆、IP 备份
└── logs\
    └── ipmanager_YYYYMMDD.log   # 操作日志

设备配置字段

字段 类型 必填 默认值 说明
name string 设备名称,如"核心交换机-A"
device_ip string 设备管理口 IP 地址
ip_mode string auto 网卡 IP 策略:auto(自动计算)或 manual(手动指定)
adapter_ip string "" ip_mode=manual 时,手动指定的网卡 IP
subnet_mask string 255.255.255.0 子网掩码
gateway string "" 网关(可选,通常管理网段不需要)
management_url string https://{device_ip} 设备 Web 管理页面 URL
favorite bool false 是否收藏

IP模式说明

自动模式(auto)

根据设备 IP 和子网掩码,自动计算网段的最后一个可用 IP 作为网卡 IP。

设备 IP: 10.251.251.251 / 255.255.255.0
       → 网卡 IP 自动计算为: 10.251.251.254

计算逻辑:取网段内最后一个可用主机 IP(排除网络地址、广播地址),若与设备 IP 相同则自动取倒数第二个;使用 O(1) 计算,不遍历全部地址。

注意:子网掩码 0.0.0.0 与 /31、/32 网段会被拒绝(无法提供可用主机 IP)。

手动模式(manual)

直接使用 adapter_ip 字段指定的 IP 地址。

配置文件示例

devices:
  - name: 核心交换机
    device_ip: 10.251.251.251
    ip_mode: auto
    adapter_ip: ""
    subnet_mask: 255.255.255.0
    gateway: ""
    management_url: https://10.251.251.251
    favorite: true

  - name: 防火墙
    device_ip: 192.168.0.1
    ip_mode: manual
    adapter_ip: 192.168.0.100
    subnet_mask: 255.255.255.0
    gateway: ""
    management_url: https://192.168.0.1
    favorite: false

network_adapters:
  last_selected_mac: "AA:BB:CC:DD:EE:FF"

backups:
  AA:BB:CC:DD:EE:FF:
    - ip: 192.168.1.100
      mask: 255.255.255.0
      gateway: 192.168.1.1
      is_dhcp: true
      adapter_name: "以太网"
      timestamp: "2024-01-15 14:30:00"

ip_history:
  AA:BB:CC:DD:EE:FF:
    - ip: 192.168.1.100
      mask: 255.255.255.0
      gateway: 192.168.1.1
      timestamp: "2024-01-15 14:30:00"
    - ip: 10.251.251.254
      mask: 255.255.255.0
      gateway: ""
      timestamp: "2024-01-15 10:20:00"

settings:
  auto_open_page: false          # 配置成功后自动打开管理页面
  filter_virtual_adapters: true  # 网卡列表默认过滤虚拟网卡
  update_check:
    enabled: true                # 启动时自动检查更新
    url: ""                      # 自定义检测地址(镜像),留空使用内置源
  hooks:
    after_configure: ""          # 配置成功后执行的命令(可选)
    after_restore: ""            # 恢复成功后执行的命令(可选)

项目结构

ipmg/
├── main.py                    # 程序入口
├── requirements.txt           # Python 依赖清单
├── .gitignore                 # Git 忽略规则
├── LICENSE                    # MIT 开源许可
├── ipmg.spec                  # 主程序 PyInstaller 打包配置
├── ipmg-editor.spec           # 配置编辑器打包配置
│
├── core/                      # 核心功能模块
│   ├── __init__.py
│   ├── adapter_manager.py     # 网卡枚举与选择
│   ├── config_manager.py      # 配置文件管理
│   ├── ip_configurator.py     # IP 配置执行
│   ├── network_utils.py       # 网络工具函数
│   ├── browser_launcher.py    # 浏览器启动
│   ├── operations.py          # 业务操作层(配置/恢复核心步骤)
│   ├── preflight.py           # 配置前预检(IP冲突/网关/可达性)
│   ├── update_check.py        # 版本更新检测
│   └── version.py             # 版本号唯一来源
│
├── ui/                        # TUI 界面模块
│   ├── __init__.py
│   ├── app.py                 # 主界面与流程控制
│   ├── actions.py             # 动作注册表(主菜单入口)
│   ├── device_manager.py      # 设备管理界面
│   ├── header.py              # 固定标题栏
│   ├── settings.py            # 设置界面
│   ├── status.py              # 跨页面状态(上次操作结果)
│   └── widgets.py             # 统一交互组件(菜单/确认/剪贴板)
│
├── editor/                    # 配置可视化编辑器(GUI, tkinter)
│   ├── __init__.py
│   ├── app.py                 # 主窗口
│   ├── storage.py             # 配置读写(严格校验+原子保存)
│   ├── device_page.py         # 设备管理页
│   ├── settings_page.py       # 设置页
│   ├── backup_page.py         # 备份与历史页
│   └── __main__.py            # python -m editor 入口
│
└── utils/                     # 工具模块
    ├── __init__.py
    ├── backup.py              # IP 备份与恢复
    └── logger.py              # 日志记录

模块说明

core/adapter_manager.py

通过 Windows GetAdaptersAddresses API(ctypes 调用 iphlpapi.dll)枚举所有物理网卡,获取:

  • 网卡友好名称(如"以太网 2")
  • MAC 地址
  • 当前 IP / 子网掩码
  • 连接状态(已连接 / 未连接 / 介质断开)
  • 网卡类型(以太网 / 无线 / USB)

支持断开的网卡显示,不会过滤掉 NetConnectionStatus=7 的适配器。

core/config_manager.py

YAML 格式的配置文件管理:

  • 自动创建默认配置(首次运行)
  • 配置文件损坏时自动备份并重建
  • 设备配置规范化(补充缺失字段)
  • 备份栈 / IP 历史记录管理(每网卡最多 10 条)
  • 导入导出功能(导入前严格校验结构与字段类型)

core/ip_configurator.py

通过 WMI Win32_NetworkAdapterConfiguration 执行 IP 配置:

  • EnableStatic() — 设置静态 IP 和子网掩码
  • SetGateways() — 设置默认网关
  • EnableDHCP() — 恢复 DHCP 自动获取
  • get_current_ip_config() — 查询当前 IP 配置状态

core/network_utils.py

网络工具函数:

  • ping_host() — ICMP Ping 检测主机可达性(校验 Echo Reply 的 type/ID,超时自动关闭 socket;无权限时降级为 TCP 探测)
  • calculate_adapter_ip_auto() — O(1) 自动计算网卡 IP(取网段最后可用主机 IP,自动规避设备 IP)
  • validate_ip() / validate_subnet_mask() — IP 和掩码格式验证(拒绝全 0 掩码)

core/browser_launcher.py

在管理员进程中启动浏览器:

  • 优先使用 os.startfile()
  • 失败时备选使用 ctypes.windll.shell32.ShellExecuteW

core/operations.py

业务操作层,配置/恢复的核心步骤与 TUI 展示解耦(供界面、CLI、自动化测试复用):

  • build_configure_plan() — 解析设备配置生成网卡配置计划
  • apply_static() / restore_to_dhcp() — 执行静态 IP / DHCP 切换
  • undo_to_backup() — 多级撤销(先应用成功再弹出备份,失败保留备份栈)
  • run_hooks() — 配置/恢复成功后执行用户自定义命令

core/preflight.py

配置前预检,在切换 IP 前执行:

  • 本机其他网卡 IP 冲突(错误,阻止配置)
  • ARP 表冲突(警告,ARP 缓存可能过期)
  • 网关是否在掩码网段内(错误,阻止配置)
  • 目标设备可达性(警告)

core/update_check.py

版本更新检测:

  • parse_version() / is_newer() — 版本号解析与比较
  • check_latest() — 从 GitHub API、源站重定向或镜像站按序获取最新版本
  • UpdateChecker — 后台线程检测,不阻塞 TUI

core/version.py

版本信息唯一来源(APP_VERSION / APP_VERSION_DISPLAY / 检测源配置),标题栏与打包共用。

ui/app.py

主 TUI 界面:

  • show_main_menu() — 主菜单(基于动作注册表,记忆上次动作)
  • run_configure_flow() — 配置 IP 完整流程(支持分组浏览与设备搜索)
  • run_restore_flow() — 恢复 IP 流程(DHCP + 多级撤销栈 + 历史记录)
  • run_export_import_flow() — 导入导出流程

ui/widgets.py

统一交互组件,所有页面共用:

  • pick_option() — 选择菜单(分页、关键字过滤、键盘导航、复制、不可选项、固定尾部)
  • confirm() — 统一确认对话框(危险操作默认拒绝)
  • copy_to_clipboard() — 复制文本到剪贴板

ui/actions.py

动作注册表:主菜单、快捷键与 main 循环的单一数据来源,新增功能注册一条 Action 即可获得菜单入口。

ui/settings.py

设置界面:自动打开管理页、虚拟网卡过滤、配置/恢复成功后执行命令(钩子),设置持久化到 config.yamlsettings 段。

ui/status.py

跨页面轻量状态模块:保存"上次操作结果",在标题栏展示,成功路径无需强制等待回车。

ui/header.py

固定标题栏模块:

  • 每次进入新页面时 cls 清屏 + 重绘标题栏
  • 实时显示当前选中网卡的 IP、掩码、网关、DHCP/静态状态
  • 网卡状态带 3 秒缓存,避免菜单切换卡顿

utils/backup.py

网卡 IP 备份与恢复:

  • backup_adapter_config() — 通过 WMI 查询当前 IP 并保存到配置文件
  • 撤销恢复:先应用成功再弹出备份,失败时备份栈保持不变

utils/logger.py

Python logging 日志模块:

  • 日志文件按日期滚动
  • 自动创建日志目录

editor/(配套 GUI 编辑器)

独立的配置可视化编辑器(tkinter,产物 ipmg-config-editor.exe):

  • storage.py — 配置读写:打开前严格校验,损坏文件拒绝打开;保存复用主程序原子写入与备份
  • device_page.py — 设备表格与增删改表单,校验与主程序一致
  • settings_page.py — 按 SETTING_SCHEMA 生成设置表单(含网卡记忆)
  • backup_page.py — 备份栈与历史记录展示、清空

技术实现

IP 配置原理

使用 WMI(Windows Management Instrumentation)的 Win32_NetworkAdapterConfiguration 类操作网卡 IP:

import wmi

c = wmi.WMI()

# 查找网卡
for adapter in c.Win32_NetworkAdapter(NetConnectionID="以太网 2"):
    # 通过 Index 关联到配置对象
    for config in c.Win32_NetworkAdapterConfiguration(Index=adapter.DeviceID):
        # 设置静态 IP
        config.EnableStatic(IPAddress=["10.251.251.254"], SubnetMask=["255.255.255.0"])
        # 恢复 DHCP
        config.EnableDHCP()

网卡枚举原理

使用 Windows IP Helper API(iphlpapi.dll)的 GetAdaptersAddresses 函数获取所有网卡接口信息,包括:

  • IP_ADAPTER_ADDRESSES 结构体中的接口类型、连接状态(OperStatus)、物理地址、友好名称
  • 单播地址链表 IP_ADAPTER_UNICAST_ADDRESS 中的 IP 地址和前缀长度(OnLinkPrefixLength)

管理员提权

通过 ctypes.windll.shell32.ShellExecuteW 调用 runas 动词实现 UAC 提权:

result = ctypes.windll.shell32.ShellExecuteW(
    None, "runas", sys.executable,
    f'"{os.path.abspath(sys.argv[0])}"', None, 1
)
if result <= 32:  # 用户取消 UAC 或提权失败
    # 提示后继续以普通权限运行

说明:脚本路径会加引号以兼容带空格的路径;PyInstaller 打包模式下直接以 exe 本身提权,不再重复传入自身路径。提权失败或用户取消时程序会给出提示并继续运行(网卡配置功能不可用)。

编译打包

使用 PyInstaller 打包为单文件 exe:

# 安装 PyInstaller(需要 6.x,spec 使用 6.x 的 API)
pip install "pyinstaller>=6.0"

# 主程序(含依赖排除与优化配置)
python -m PyInstaller ipmg.spec --noconfirm --clean

# 配置可视化编辑器(GUI,窗口模式)
python -m PyInstaller ipmg-editor.spec --noconfirm --clean

# 产物位于 dist\,可复制到项目根目录直接运行
Copy-Item dist\ipmg.exe .\ipmg.exe -Force
Copy-Item dist\ipmg-config-editor.exe .\ipmg-config-editor.exe -Force

主程序产物约 15MB,编辑器约 12MB;首次启动约 3-5 秒(解压到临时目录)。

注意事项

  1. 管理员权限 — 程序必须以管理员权限运行才能操作网卡 IP,启动时会自动 UAC 提权
  2. DHCP 恢复需要接线 — 断开的网卡无法切换到 DHCP 模式(WMI EnableDHCP 返回错误码 84),需要接入网线后重试
  3. 仅支持 Windows — 使用了 WMI、Windows API、os.startfile() 等 Windows 专有接口
  4. 网卡 IP 冲突 — 同一网段只能有一个网卡配置该 IP
  5. 中文编码 — 程序启动时自动设置控制台为 UTF-8 编码

常见问题

Q: 启动后闪退? A: 程序需要管理员权限。右键 ipmg.exe → 属性 → 兼容性 → 勾选"以管理员身份运行此程序"。

Q: 恢复 DHCP 失败,提示"网卡当前未连接"? A: 断开网线的网卡无法切换到 DHCP 模式。请先接入网线,再执行恢复操作。

Q: 打开管理页面没反应? A: 在管理员进程中浏览器启动方式不同,程序已做兼容处理。如果仍无法打开,请手动复制 URL 到浏览器。

Q: 配置文件在哪里? A: %USERPROFILE%\ipmg\config.yaml(即 C:\Users\<你的用户名>\ipmg\config.yaml)。

Q: 如何在多台电脑上共享设备配置? A: 使用"导出配置"功能导出 YAML 文件,在其他电脑上使用"导入配置"导入。

Q: 导入配置时提示"导入失败"? A: 导入前程序会严格校验文件结构,损坏或格式错误的 YAML(如 devices 不是列表)会被拒绝,现有配置不受影响。请检查文件内容或重新导出。

Q: 取消 UAC 授权后程序还在运行,但配置失败? A: 程序在提权失败或取消时会继续运行,但 WMI 操作网卡 IP 需要管理员权限。请以管理员身份重新运行。

Q: 支持无线网卡吗? A: 支持。无线网卡也会在网卡列表中显示,但需要注意 WiFi 连接状态。

技术栈

版本 用途
Python 3.11+ 运行环境(3.11 / 3.14 均已验证)
Rich >=13.0.0 终端美化输出(颜色、表格、样式)
PyYAML >=6.0 YAML 配置文件读写
WMI >=1.5.0 Windows 管理规范接口(IP 配置操作)
pywin32 >=306 Windows API 调用支持
netaddr >=0.9.0 IP 地址计算(网段分析、可用 IP 计算)
tkinter 标准库 配置可视化编辑器 GUI
PyInstaller >=6.0 打包为单文件 exe(开发依赖)

License

本项目采用 MIT 开源协议发布,完整许可文本见 LICENSE

Releases

Packages

Contributors

Languages