You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用win32com.client获取当前WiFi连接失败,Windows 10代理自动切换脚本报错求助

win32com.client获取当前WiFi连接失败,Windows 10代理自动切换脚本报错求助

我太懂这种手动切代理的痛苦了——有时候忘了开代理半天连不上网,折腾半天才反应过来。咱们一步步把你的脚本问题解决掉:

一、你当前代码的核心问题

  1. 获取WiFi名称的方式完全错误
    你用Win32_NetworkAdapter查询到的是WiFi硬件适配器本身,NetConnectionID是适配器的名字(比如默认的“Wi-Fi”),根本不是你连接的WiFi网络SSID(也就是你要的ENSIAS-STUDENT)。所以不管你连哪个网络,拿到的都是“Wi-Fi”,完全起不到判断作用,而且这个类也没有Setting属性,才会报错AttributeError: .Setting。

  2. 设置代理的逻辑完全偏离
    你操作的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全局代理的核心配置位置,修改后发送通知让系统立即生效。
  • 优化点:加入了状态判断,只有当网络变化导致代理需要切换时才执行设置操作,避免每秒重复修改。

三、注意事项

  1. 脚本需要安装依赖:pywin32,可以用pip install pywin32安装。
  2. 不需要管理员权限(因为修改的是当前用户的注册表项)。
  3. 如果你的WiFi名称带特殊字符,脚本里的strip('"')可以处理WMI返回的SSID带引号的情况。

备注:内容来源于stack exchange,提问作者EVOLVE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:00:31