使用win32com.client获取当前WiFi连接失败,Windows 10代理自动切换脚本报错求助
win32com.client获取当前WiFi连接失败,Windows 10代理自动切换脚本报错求助
我太懂这种手动切代理的痛苦了——有时候忘了开代理半天连不上网,折腾半天才反应过来。咱们一步步把你的脚本问题解决掉:
一、你当前代码的核心问题
获取WiFi名称的方式完全错误
你用Win32_NetworkAdapter查询到的是WiFi硬件适配器本身,NetConnectionID是适配器的名字(比如默认的“Wi-Fi”),根本不是你连接的WiFi网络SSID(也就是你要的ENSIAS-STUDENT)。所以不管你连哪个网络,拿到的都是“Wi-Fi”,完全起不到判断作用,而且这个类也没有Setting属性,才会报错AttributeError: .Setting。设置代理的逻辑完全偏离
你操作的settings.IPX是老式的IPX协议设置,和咱们常用的HTTP代理半毛钱关系都没有,这部分代码等于白写。另外你用netsh winhttp set proxy设置的是WinHTTP代理(给系统服务、某些后台程序用的),而浏览器、普通APP用的是Windows全局代理(也就是IE代理设置),所以设置后网络还是无法正常工作。
二、修正后的完整解决方案
我给你整理了一套可以正常工作的脚本,核心做了两个关键修正:正确获取当前WiFi的SSID,以及正确设置Windows全局代理。
1. 完整代码
import win32com.client import win32api import win32con import win32gui import time # 替换成需要开启代理的WiFi名称 TARGET_NETWORK_NAME = "ENSIAS-STUDENT" # 替换成你的代理地址和端口 PROXY_SERVER_ADDRESS = "10.23.201.11" PROXY_SERVER_PORT = 3128 def get_current_wifi_ssid(): """获取当前连接的WiFi网络SSID""" try: wmi = win32com.client.GetObject("winmgmts:") # 查询当前已连接的WiFi连接 wifi_connections = wmi.ExecQuery("SELECT * FROM Win32_WiFiNetworkConnection WHERE IsConnected=True") if wifi_connections: # SSID可能带引号,需要处理一下 ssid = wifi_connections[0].SSID.strip('"') return ssid else: # 没有WiFi连接时返回空字符串 return "" except Exception as e: print(f"获取WiFi名称失败: {e}") return "" def set_global_proxy(enabled: bool): """设置Windows全局代理(IE/浏览器通用)""" reg_path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings" try: # 打开注册表项(当前用户权限即可) key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, reg_path, 0, win32con.KEY_WRITE) # 设置代理启用状态 win32api.RegSetValueEx(key, "ProxyEnable", 0, win32con.REG_DWORD, 1 if enabled else 0) # 设置代理服务器地址 if enabled: proxy_str = f"{PROXY_SERVER_ADDRESS}:{PROXY_SERVER_PORT}" win32api.RegSetValueEx(key, "ProxyServer", 0, win32con.REG_SZ, proxy_str) # 设置不需要代理的地址(比如本地地址) win32api.RegSetValueEx(key, "ProxyOverride", 0, win32con.REG_SZ, "<local>") else: # 禁用时清空代理地址 win32api.RegSetValueEx(key, "ProxyServer", 0, win32con.REG_SZ, "") win32api.RegCloseKey(key) # 发送通知让系统刷新代理设置 win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Internet Settings") print(f"代理已{'启用' if enabled else '禁用'}") except Exception as e: print(f"设置代理失败: {e}") if __name__ == "__main__": print("代理自动切换脚本已启动...") last_proxy_state = None # 记录上一次的代理状态,避免重复设置 while True: current_ssid = get_current_wifi_ssid() # 判断是否需要启用代理 need_proxy = (current_ssid == TARGET_NETWORK_NAME) # 只有当状态变化时才设置代理,减少不必要的操作 if need_proxy != last_proxy_state: set_global_proxy(need_proxy) last_proxy_state = need_proxy # 每5秒检查一次(可以根据需求调整) time.sleep(5)
2. 关键说明
- 获取WiFi SSID:用
Win32_WiFiNetworkConnection类查询已连接的WiFi,直接拿到SSID,这才是你需要判断的网络名称。 - 设置全局代理:通过修改注册表的
Internet Settings项来设置,这是Windows全局代理的核心配置位置,修改后发送通知让系统立即生效。 - 优化点:加入了状态判断,只有当网络变化导致代理需要切换时才执行设置操作,避免每秒重复修改。
三、注意事项
- 脚本需要安装依赖:
pywin32,可以用pip install pywin32安装。 - 不需要管理员权限(因为修改的是当前用户的注册表项)。
- 如果你的WiFi名称带特殊字符,脚本里的
strip('"')可以处理WMI返回的SSID带引号的情况。
备注:内容来源于stack exchange,提问作者EVOLVE
相关产品推荐
相关产品推荐

