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

Windows 10使用Python winreg设置系统代理出现PermissionError权限错误求助

错误原因

  • 注册表打开权限参数配置错误:你仅指定了winreg.KEY_SET_VALUE写入权限,但Windows 10对网络配置类注册表项的修改操作,要求同时持有读权限才能正常完成写入校验;另外64位系统存在注册表重定向机制,你使用的64位Python如果没有指定访问64位注册表节点,会访问到重定向后的虚拟节点,触发权限报错。
  • Internet Settings项默认有系统安全保护,未经过签名的程序直接修改该路径下的代理相关配置时,哪怕是管理员身份也会被系统权限机制拦截。
  • 你打开注册表键后没有主动释放句柄,长期占用也会触发系统的权限校验拦截。

解决方案

方案1:修正winreg模块调用参数

调整注册表打开时的权限参数,新增读权限和64位节点访问标识,操作完成后主动刷新并关闭句柄:

import winreg

INTERNET_SETTINGS = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
                                   r'SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings',
                                   0, 
                                   winreg.KEY_READ | winreg.KEY_WRITE | winreg.KEY_WOW64_64KEY)

def __set_winreg_key__(name, value):
    _, reg_type = winreg.QueryValueEx(INTERNET_SETTINGS, name)
    winreg.SetValueEx(INTERNET_SETTINGS, name, 0, reg_type, value)
    winreg.FlushKey(INTERNET_SETTINGS)

ip = "x.x.x.x"
port = 8080

__set_winreg_key__('ProxyEnable', 1)
__set_winreg_key__('ProxyOverride', '*.local;<local>')
__set_winreg_key__('ProxyServer', f"{ip}:{port}")

winreg.CloseKey(INTERNET_SETTINGS)

修改完成后右键点击PyCharm选择「以管理员身份运行」,再执行脚本即可。

方案2:调用系统注册表命令绕开权限校验

如果方案1仍然报错,可以直接调用Windows原生的reg add命令修改注册表,不需要处理winreg的句柄权限问题:

import subprocess

ip = "x.x.x.x"
port = 8080

subprocess.run(['reg', 'add', r'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings', '/v', 'ProxyEnable', '/t', 'REG_DWORD', '/d', '1', '/f'], capture_output=True, shell=True)
subprocess.run(['reg', 'add', r'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings', '/v', 'ProxyOverride', '/t', 'REG_SZ', '/d', '*.local;<local>', '/f'], capture_output=True, shell=True)
subprocess.run(['reg', 'add', r'HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings', '/v', 'ProxyServer', '/t', 'REG_SZ', '/d', f"{ip}:{port}", '/f'], capture_output=True, shell=True)

补充:代理配置生效方法

修改注册表后系统不会自动刷新代理配置,可以添加下面的代码调用系统API主动刷新,不需要手动打开网络设置页操作:

import ctypes

INTERNET_OPTION_REFRESH = 37
INTERNET_OPTION_SETTINGS_CHANGED = 39
internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
internet_set_option(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0)

内容的提问来源于stack exchange,提问作者Funpy97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:24:03