一个 Windows 命令行 TUI 工具,专为网络工程师设计,用于一键切换网卡的 IP 配置以对接不同管理网段的网络设备(交换机、路由器、防火墙、AP、AC 等)。
本项目完全由Vibe Coding完成(Model:DeepSeek V4 Flash 正式版 | Tool:Codex)。
网络工程师在日常运维中,经常需要将笔记本电脑的网卡 IP 改到设备管理网段(如 10.251.251.x),登录设备 Web 管理页面完成配置后,再改回原来的 IP。这个过程频繁且繁琐:
- 打开"控制面板 → 网络连接 → 属性 → IPv4 → 手动填写 IP/掩码/网关"
- 浏览器输入设备管理地址
- 操作完成后又要改回 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),可视化编辑本地配置文件 |
- 版本更新检测:启动时后台检测 GitHub(或镜像站)最新版本,标题栏提醒;主菜单新增"检查更新"(快捷键
u),可打开 Release 页面;可在设置中关闭或指定镜像地址- "检查更新"无论是否有新版本,均展示 GitHub 最新版本与本地版本(含完整版本号)
- 配置前预检:配置 IP 前检查本机 IP 冲突、ARP 冲突、网关网段、设备可达性,错误项阻止配置、警告项提示后继续
- 配置原子保存与自动备份:写入改为临时文件 + 原子替换,并保留上一版
config.yaml.bak,异常时原配置不受影响 - 配套配置可视化编辑器(GUI,tkinter):独立程序
ipmg-config-editor,可打开/编辑/保存本地配置(设备、设置、网卡记忆、备份与历史),校验与主程序一致,损坏文件拒绝打开 - 版本号集中管理(
core/version.py),设置 schema(SETTING_SCHEMA)由 TUI 设置页与 GUI 编辑器共用
- 统一交互组件
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 无头模式与自动化测试铺路
- 新增设备分组/站点管理,设备列表按分组展示,支持设置分组、新建分组
- 新增多级撤销栈:每次配置 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] 管理页面已打开
- 下载
ipmg.exe - 双击运行(会自动弹出 UAC 提权确认)
- 首次运行选择"管理设备"添加你的设备信息
- 之后选择"配置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、将要配置的网卡IP、子网掩码等信息
- 自动备份 — 自动备份当前网卡的 IP 配置
- 执行配置 — 通过 WMI 设置静态 IP
- Ping 验证 — 自动 Ping 设备检查连通性
- 打开管理页面 — 可选择直接打开设备的 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的网卡
- 选择恢复方式 — 显示恢复选项列表:
- 第一项固定为 "恢复为 DHCP(自动获取)"
- 随后显示撤销栈中的备份版本(每次配置 IP 前的状态,可多级撤销)
- 最后显示最近10条静态IP历史记录(IP/掩码/网关/时间戳)
- 确认恢复 — 确认后执行恢复
- 执行恢复 — DHCP 模式调用
EnableDHCP,静态模式调用EnableStatic
恢复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 |
是否收藏 |
自动模式(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 # 日志记录
通过 Windows GetAdaptersAddresses API(ctypes 调用 iphlpapi.dll)枚举所有物理网卡,获取:
- 网卡友好名称(如"以太网 2")
- MAC 地址
- 当前 IP / 子网掩码
- 连接状态(已连接 / 未连接 / 介质断开)
- 网卡类型(以太网 / 无线 / USB)
支持断开的网卡显示,不会过滤掉 NetConnectionStatus=7 的适配器。
YAML 格式的配置文件管理:
- 自动创建默认配置(首次运行)
- 配置文件损坏时自动备份并重建
- 设备配置规范化(补充缺失字段)
- 备份栈 / IP 历史记录管理(每网卡最多 10 条)
- 导入导出功能(导入前严格校验结构与字段类型)
通过 WMI Win32_NetworkAdapterConfiguration 执行 IP 配置:
EnableStatic()— 设置静态 IP 和子网掩码SetGateways()— 设置默认网关EnableDHCP()— 恢复 DHCP 自动获取get_current_ip_config()— 查询当前 IP 配置状态
网络工具函数:
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 掩码)
在管理员进程中启动浏览器:
- 优先使用
os.startfile() - 失败时备选使用
ctypes.windll.shell32.ShellExecuteW
业务操作层,配置/恢复的核心步骤与 TUI 展示解耦(供界面、CLI、自动化测试复用):
build_configure_plan()— 解析设备配置生成网卡配置计划apply_static()/restore_to_dhcp()— 执行静态 IP / DHCP 切换undo_to_backup()— 多级撤销(先应用成功再弹出备份,失败保留备份栈)run_hooks()— 配置/恢复成功后执行用户自定义命令
配置前预检,在切换 IP 前执行:
- 本机其他网卡 IP 冲突(错误,阻止配置)
- ARP 表冲突(警告,ARP 缓存可能过期)
- 网关是否在掩码网段内(错误,阻止配置)
- 目标设备可达性(警告)
版本更新检测:
parse_version()/is_newer()— 版本号解析与比较check_latest()— 从 GitHub API、源站重定向或镜像站按序获取最新版本UpdateChecker— 后台线程检测,不阻塞 TUI
版本信息唯一来源(APP_VERSION / APP_VERSION_DISPLAY / 检测源配置),标题栏与打包共用。
主 TUI 界面:
show_main_menu()— 主菜单(基于动作注册表,记忆上次动作)run_configure_flow()— 配置 IP 完整流程(支持分组浏览与设备搜索)run_restore_flow()— 恢复 IP 流程(DHCP + 多级撤销栈 + 历史记录)run_export_import_flow()— 导入导出流程
统一交互组件,所有页面共用:
pick_option()— 选择菜单(分页、关键字过滤、键盘导航、复制、不可选项、固定尾部)confirm()— 统一确认对话框(危险操作默认拒绝)copy_to_clipboard()— 复制文本到剪贴板
动作注册表:主菜单、快捷键与 main 循环的单一数据来源,新增功能注册一条 Action 即可获得菜单入口。
设置界面:自动打开管理页、虚拟网卡过滤、配置/恢复成功后执行命令(钩子),设置持久化到 config.yaml 的 settings 段。
跨页面轻量状态模块:保存"上次操作结果",在标题栏展示,成功路径无需强制等待回车。
固定标题栏模块:
- 每次进入新页面时
cls清屏 + 重绘标题栏 - 实时显示当前选中网卡的 IP、掩码、网关、DHCP/静态状态
- 网卡状态带 3 秒缓存,避免菜单切换卡顿
网卡 IP 备份与恢复:
backup_adapter_config()— 通过 WMI 查询当前 IP 并保存到配置文件- 撤销恢复:先应用成功再弹出备份,失败时备份栈保持不变
Python logging 日志模块:
- 日志文件按日期滚动
- 自动创建日志目录
独立的配置可视化编辑器(tkinter,产物 ipmg-config-editor.exe):
storage.py— 配置读写:打开前严格校验,损坏文件拒绝打开;保存复用主程序原子写入与备份device_page.py— 设备表格与增删改表单,校验与主程序一致settings_page.py— 按SETTING_SCHEMA生成设置表单(含网卡记忆)backup_page.py— 备份栈与历史记录展示、清空
使用 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 秒(解压到临时目录)。
- 管理员权限 — 程序必须以管理员权限运行才能操作网卡 IP,启动时会自动 UAC 提权
- DHCP 恢复需要接线 — 断开的网卡无法切换到 DHCP 模式(WMI
EnableDHCP返回错误码 84),需要接入网线后重试 - 仅支持 Windows — 使用了 WMI、Windows API、
os.startfile()等 Windows 专有接口 - 网卡 IP 冲突 — 同一网段只能有一个网卡配置该 IP
- 中文编码 — 程序启动时自动设置控制台为 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(开发依赖) |
本项目采用 MIT 开源协议发布,完整许可文本见 LICENSE。