任务计划程序+netsh.exe实现有线网卡连通时禁用wifi

本文介绍了如何使用Windows任务计划程序和netsh.exe,结合Linux和Windows的网络管理,实现插入以太网线时自动禁用WiFi,拔出时自动启用,以满足公司内网和公网切换的需求。

我们插拔网线时,Windows 事件查看器会记录LAN 适配器断开连接和重新连接的状态。根据此,我们可以使用任务计划程序“当特定事件被记录”的触发器,启动nstsh.exe实现,windows根据有线连接的连接状态禁用或重新启用 Wifi 适配器。

公司规定WIFI只能连接公网,若想连接公司内网必须使用网线并禁用无线网卡,不希望将时间浪费在切换网络上,参考了网上帖子,使办公电脑自动实现连接有线时自动禁用无线网卡,拔出网线自动启用无线网卡。

一、确定启用禁用网卡命令

  1. 通过控制面板 -> 网络和共享中心 ->更爱适配器设置,查看本机网卡名称

请添加图片描述

  1. 以管理员身份身份运行 cmd 程序,确定禁用网卡的命令是否生效
#禁用无线网卡:netsh interface set interface WLAN disabled
#启用无线网卡:netsh interface set interface WLAN enabled
#禁用有线网卡:netsh interface set interface "以太网" disabled
#启用有线网卡:netsh interface set interface "以太网" enabled

二、创建自动切换的任务

import subprocess import time from urllib.parse import quote import os import sys # ---------- 配置区(按需修改) ---------- iface_name = "以太网" # 要禁用/启用的网卡名(Windows 显示名) ipc_ip = "192.168.0.60" # IPC 的 IP(用于拼 URL) multicast_path = "/multicastStream1" # 组播路径 rtsp_port = "554" # RTSP 端口 vlc_exe = r"D:\UserData\Documents\VLC\vlc.exe" # vlc.exe 路径 play_seconds = 5 # 播放长(秒) # ---------------------------------------- def run_cmd(cmd, check=False, capture=False): """辅助运行命令并返回 CompletedProcess(自动处理错误信息)。""" try: if capture: return subprocess.run(cmd, text=True, capture_output=True, check=check) else: return subprocess.run(cmd, check=check) except subprocess.CalledProcessError as e: return e def set_interface_state(name, enable=True): """Windows 下用 netsh 启用/禁用网络适配器。enable=True 启用,False 禁用""" action = "enable" if enable else "disable" cmd = ["netsh", "interface", "set", "interface", name, action] print(f"执行: {' '.join(cmd)}") res = run_cmd(cmd, capture=True) # res.returncode 0 表示成功 return res def play_multicast_and_check(ip, path, port, vlc_path, duration): """用 VLC 播放指定 RTSP,播放 duration 秒,返回 True/False(是否有播放迹象)""" url = f"rtsp://{ip}:{port}{path}" print("播放 RTSP URL:", url) cmd = [ vlc_path, "--no-one-instance", "--rtsp-tcp", "--network-caching=1500", "-vvv", url, "--run-time={}".format(duration), "vlc://quit" ] # 指定 encoding='utf-8' 并忽略解码错误以避免 Windows 控制台编码问题 try: res = subprocess.run(cmd, text=True, capture_output=True, encoding="utf-8", errors="ignore") except Exception as e: print("启动 VLC 异常:", e) return False log = (res.stdout or "") + (res.stderr or "") success_keys = [ "stream buffering done", "started playback", "playing", "play started", "live555 debug: play", "decoder debug:", "stream opened successfully", "opening stream" ] played = any(k in log.lower() for k in success_keys) # 调试可取消下面一行注释查看日志片段 # print("VLC log tail:\\n", log[-2000:]) return played def main(): # 权限提示 if os.name != "nt": print("该脚本仅用于 Windows使用 netsh 管理网卡)。") return # 检查 vlc 可执行文件 if not os.path.exists(vlc_exe): print("找不到 vlc.exe,请确认 vlc_exe 路径:", vlc_exe) return print("注意:执行网卡禁用/启用需要管理员权限,并会影响网络连通性。") input("确认继续请按 Enter(取消请 Ctrl+C)...") # 1) 禁用网卡 print("尝试禁用网卡:", iface_name) res_disable = set_interface_state(iface_name, enable=False) if hasattr(res_disable, "returncode") and res_disable.returncode != 0: print("禁用网卡返回非0(可能失败),stdout/stderr:\n", getattr(res_disable, "stdout", ""), getattr(res_disable, "stderr", "")) # 仍继续尝试播放(视你的需求可以直接返回) else: print("已发出禁用网卡命令,等待 1 秒以稳定状态...") time.sleep(1) # 2) 播放组播 RTSP 并检测 try: played = play_multicast_and_check(ipc_ip, multicast_path, rtsp_port, vlc_exe, play_seconds) if played: print("RTSP 播放成功(已检测到播放迹象)") else: print("RTSP 未播放(未检测到播放迹象)") finally: # 3) 确保重新启用网卡(清理) print("恢复网卡:", iface_name) res_enable = set_interface_state(iface_name, enable=True) if hasattr(res_enable, "returncode") and res_enable.returncode != 0: print("启用网卡失败,stdout/stderr:\n", getattr(res_enable, "stdout", ""), getattr(res_enable, "stderr", "")) else: print("已发出启用网卡命令。若仍无网络,请手动检查网络适配器。") if __name__ == "__main__": main()
最新发布
10-25
xp下用netsh禁用启用网卡 在XP系统中不支持netsh interface set interface name命令扩展,所以此命令是无法正常运行的,提取2003下的ifmon.dll文件覆盖,就可以用了。 winxp下使用netsh interface set interface "本地连接" "disabled" 会出现 如下错误提示: 代码: C:\>netsh interface set interface "本地连接" "disabled" 没有指定一个或多个关键性参数 此命令提供的语法不正确。请查看帮助以获取正确的语法信息。 用法 set interface [name = ] IfName [ [admin = ] ENABLED|DISABLED [connect = ] CONNECTED|DISCONNECTED [newname = ] NewName ] 设置接口参数。 IfName - 接口名称 admin - 接口是否被启用 (仅用于非 LAN)。 connect - 是否连接接口 (仅用于非 LAN)。 newname - 接口的新名称 (仅用于非 LAN)。 注意: - 除名称外,还必须至少指定一个选项。 - 如果 connect = CONNECTED 被指定,那么接口被自动 启用,甚至在 admin = DISABLED 选项被指定也是如 此。 =========================== 替换XP下的ifmon.dll步骤: 但是你可以把win2003系统下 C:\\WINDOWS\\system32\\ifmon.dll文件 拷贝到winxp系统下来使用,从而实现网卡的禁用,启用拷贝候需要注意:需要先把 ifmon.dll文件拷贝到 C:\\WINDOWS\\system32\\dllcache 替换掉系统文件再拷贝到 C:\\WINDOWS\\system32 替换掉系统文件,若系统会提示 文件被修改了,是否从安装盘还原,选择保持修改的文件就替换成功了。 替换后就可以正常使用netsh命令来禁用,启用网卡了 =========================== 根目录附件中上有win2003的ifmon.dll文件备份 DOS下重启网卡 @ rem 关闭网卡: netsh interface set interface name="本地连接" admin=DISABLED @ rem 开启网卡: netsh interface set interface name="本地连接" admin=ENABLED 使用PPPOE协议进行宽带拨号,若要重新拨号,不要对使用PPPOE的“宽带连接netsh,而应该对“本地连接netsh WN7可直接用批处理 如果还不会下载我的附件吧0分。内含有XP用win2003的ifmon.dll文件备份及所用所有批处理文件。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值