Windows PowerShell设置代理:从单次请求到系统配置
2026年9月28日 · 教程 · 18 分钟阅读
Windows PowerShell设置代理,最直接的方法是在 Invoke-WebRequest 命令中加入 -Proxy;代理需要账号密码时,再加上 -ProxyCredential。 这只影响当前请求,通常不需要管理员权限,也不必先修改整台电脑的网络设置。
真正容易出错的地方,是把几种代理配置混在一起:浏览器能打开网页,不代表PowerShell脚本使用了同一个代理;netsh 显示配置成功,也不代表所有程序都会读取它。下面先完成一次可验证的HTTPS请求,再按需要扩展到会话默认值、环境变量、Windows用户代理和WinHTTP。
先选方法:你需要给哪一层设置代理?
| 使用需求 | 建议方法 | 生效范围 | 版本或权限要求 |
|---|---|---|---|
| 临时访问一个网页或API | -Proxy 参数 |
当前这一次Web请求 | Windows PowerShell 5.1、PowerShell 7;通常无需管理员权限 |
| 同一个窗口中反复调用API | $PSDefaultParameterValues |
当前会话中指定的命令 | 5.1、7均可 |
| 让新启动的PowerShell 7读取代理 | 代理环境变量 | 会读取这些变量的进程和客户端 | 本文按PowerShell 7说明 |
| 给遵循Windows用户设置的软件配置代理 | Windows“代理”设置页面 | 读取该设置的应用 | Windows 10、Windows 11 |
| 给使用WinHTTP默认配置的服务设置代理 | netsh winhttp |
读取WinHTTP配置的组件 | 修改机器配置需相应管理员权限 |
只选择符合需求的方法,不需要把五种配置全部执行一遍。 例如,脚本调用一个业务接口时,先使用 -Proxy 更容易确认请求路径;只有目标服务明确使用WinHTTP,才需要修改WinHTTP配置。
开始前,在当前窗口运行:
$PSVersionTable
Get-Command Invoke-WebRequest |
Format-List Name, Version, Source
Windows PowerShell 5.1的 PSEdition 通常是 Desktop,PowerShell 7则是 Core。Windows Terminal只是终端窗口,里面可以运行不同版本的PowerShell,不能凭窗口外观判断版本。
本文的单次请求和会话默认值示例面向Windows PowerShell 5.1与PowerShell 7;环境变量、-NoProxy 等用法另行注明版本。示例使用HTTP代理访问HTTPS目标,不涉及额外模块安装。代理连通性仍需用你自己的地址和账号验证,本文未对你的代理环境进行实测。
配置前准备:代理地址、端口和认证方式
从服务商控制台取得连接参数后再填写命令。以 Rola IP 为例,需要的是账户实际交付的代理服务器信息,不能把官网域名当作代理地址。
| 参数 | 应该填写什么 | 容易混淆的地方 |
|---|---|---|
| 服务器地址 | 控制台提供的主机名或IP | 不是官网地址,也不是要访问的网站地址 |
| 端口 | 与代理协议配套的端口 | HTTP和SOCKS5端口不能随意混用 |
| 协议 | 本文主流程使用 http:// 代理 |
目标网站是HTTPS,不代表代理地址也要改成 https:// |
| 认证 | 代理账号密码,或产品支持的IP白名单 | 代理密码不等于网站登录密码或服务商后台密码 |
如果业务接口要求登记固定来源IP,可以考虑静态住宅代理。固定出口便于维护接口白名单,但登记时要填写请求实际使用的出口IP,而不是代理网关地址。选择套餐时,再核对IP数量、有效期及流量条款。

如果任务需要按地区检查内容或进行多地区业务测试,可以评估动态住宅代理,并确认账户可用地区及会话保持参数。动态资源即使支持粘性会话,也不应直接当作长期固定IP使用。
HTTP代理可以通过CONNECT隧道转发HTTPS请求,目标网站的TLS证书仍需正常验证。不过,客户端到HTTP代理这一段本身没有TLS保护,部分认证方式可能暴露可还原的凭据,应使用服务商支持且符合网络环境要求的接入方式。
方法一:用Invoke-WebRequest为单次请求设置代理
这是排查PowerShell代理配置时最适合先尝试的方法:代理地址、认证信息和目标URL都写在同一次调用中,配置来源比较清楚。
不熟悉终端时,可以用PowerShell ISE
Windows PowerShell ISE提供脚本编辑区和输出区。它运行的是Windows PowerShell,不能用来执行PowerShell 7专属步骤。
- 在开始菜单搜索并打开 Windows PowerShell ISE,将代码粘贴到脚本编辑区。

- 选中要执行的完整代码块,点击工具栏中的 运行选定内容(Run Selection)。按下文顺序逐步执行,并保持在同一个会话中。

- 在下方控制台完成输入并查看输出。如果出现错误,先处理当前步骤,再继续。

第一步:输入实际代理地址
运行以下代码,在提示后输入 http://主机名:端口 格式的地址,不要把账号密码拼进URL。
$ProxyUri = [uri](Read-Host 'HTTP proxy URL (no credentials)')
if (-not $ProxyUri.IsAbsoluteUri -or
$ProxyUri.Scheme -ne 'http' -or
-not [string]::IsNullOrEmpty($ProxyUri.UserInfo)) {
throw 'Enter http://host:port without credentials.'
}
这里的 $ProxyUri 表示代理服务器。后续的 -Uri 表示目标网站,两者作用不同。另外,不要用 $Host 存放服务器地址,它是PowerShell内置变量。
第二步:输入代理账号和密码
$ProxyCredential = Get-Credential -Message 'Proxy credentials'
在弹窗或终端提示中输入代理认证信息。Get-Credential 返回 PSCredential 对象,可以避免将明文密码直接写进命令历史或脚本文件。不要将密码、认证头或完整凭据对象输出到日志。
如果产品允许仅用IP白名单认证,可以跳过这一步,并在下一步的参数表中删除 ProxyCredential 这一行。白名单是否能替代账号密码,应根据具体接入规则判断;有些配置需要两者同时满足。相关区别可查看代理账号白名单说明。
注意两种IP的区别:服务商的接入白名单通常填写客户端连接代理时的公网来源IP;目标业务接口的白名单则填写代理出口IP。
第三步:发送请求并查看出口IP
下面用ipify的HTTPS接口检查本次请求的IPv4出口,超时时间设为30秒:
$Request = @{
Uri = 'https://api.ipify.org?format=json'
Proxy = $ProxyUri
ProxyCredential = $ProxyCredential
UseBasicParsing = $true
TimeoutSec = 30
ErrorAction = 'Stop'
}
$Response = Invoke-WebRequest @Request
$Result = $Response.Content | ConvertFrom-Json
[pscustomobject]@{
StatusCode = [int]$Response.StatusCode
ExitIP = $Result.ip
}
检查结果时,分别看两个字段:
StatusCode:返回200表示这次检测请求成功收到正常HTTP响应。ExitIP:表示检测接口看到的请求出口,应与服务商提供的出口信息或对照请求结合判断。它不一定等于代理网关IP。
这里不预设一个“成功IP”;实际值以你的运行结果为准。单次检测成功,也不代表所有应用、IPv6流量或目标业务接口都已使用代理。
UseBasicParsing 用于Windows PowerShell 5.1的基础解析,避免启用不必要的完整网页解析;在较新PowerShell中保留该参数主要是为了兼容。不要为了继续请求而忽略安全提示或关闭证书验证。
只需要JSON数据时,改用Invoke-RestMethod
在同一个会话中复用上面的参数:
$Result = Invoke-RestMethod @Request
$Result.ip
Invoke-RestMethod 会把JSON响应解析成对象,适合API数据处理;Invoke-WebRequest 更方便同时查看状态码、响应头和原始正文。已经解析成对象的结果,无需再次调用 ConvertFrom-Json。
方法二:给当前PowerShell会话设置默认代理
同一个脚本连续访问多个接口时,可以通过 $PSDefaultParameterValues 为指定命令提供默认代理参数。它只影响当前会话中的指定命令,不是Windows全局代理开关。
保存原配置,再写入默认参数
先完成方法一中的地址和凭据输入,然后运行:
$SavedDefaults = $PSDefaultParameterValues.Clone()
$PSDefaultParameterValues['Invoke-WebRequest:Proxy'] = $ProxyUri
$PSDefaultParameterValues['Invoke-RestMethod:Proxy'] = $ProxyUri
$PSDefaultParameterValues['Invoke-WebRequest:ProxyCredential'] =
$ProxyCredential
$PSDefaultParameterValues['Invoke-RestMethod:ProxyCredential'] =
$ProxyCredential
以上适用于账号密码认证。仅用白名单的连接,只设置两个 Proxy 项,不添加 ProxyCredential 项;如果当前会话已经存在旧的认证默认值,应先检查并处理,避免沿用错误账号。
接着省略代理参数,确认默认值是否生效:
$Check = Invoke-RestMethod `
-Uri 'https://api.ipify.org?format=json' `
-TimeoutSec 30 -ErrorAction Stop
$Check.ip
显式传入的参数会覆盖对应默认值。新打开的PowerShell窗口不会自动继承这些设置,计划任务也应在自己的脚本中明确配置,不能依赖交互窗口里的变量。
使用结束后恢复
在保存配置的同一窗口中运行:
$PSDefaultParameterValues = $SavedDefaults
Remove-Variable SavedDefaults
保存和恢复应成对执行,不要反复运行备份语句覆盖最初状态,也不要直接清空整个默认参数表,以免删除其他命令的设置。
方法三:通过环境变量设置PowerShell 7代理
PowerShell 7的Web命令可以使用底层 .NET客户端支持的代理环境变量。这套方法不应直接套用到Windows PowerShell 5.1。 为减少客户端初始化和缓存带来的干扰,建议先在父窗口设置变量,再启动新的PowerShell 7进程验证。
下面适合无需交互输入代理密码的连接,例如已经完成授权的白名单接入。需要账号密码时,优先使用方法一。
在父窗口保存并设置环境变量
$ProxyUri = [uri](Read-Host 'HTTP proxy URL (no credentials)')
if (-not $ProxyUri.IsAbsoluteUri -or
$ProxyUri.Scheme -ne 'http' -or $ProxyUri.UserInfo) {
throw 'Enter http://host:port without credentials.'
}
$ProxyEnvNames = 'HTTP_PROXY','HTTPS_PROXY','ALL_PROXY','NO_PROXY'
$SavedProxyEnv = @{}
foreach ($Name in $ProxyEnvNames) {
$SavedProxyEnv[$Name] =
[Environment]::GetEnvironmentVariable($Name, 'Process')
}
$env:HTTP_PROXY = $ProxyUri.AbsoluteUri
$env:HTTPS_PROXY = $ProxyUri.AbsoluteUri
Remove-Item Env:ALL_PROXY -ErrorAction SilentlyContinue
$env:NO_PROXY = 'localhost,127.0.0.1'
pwsh -NoProfile
最后一行会进入新的PowerShell 7子进程。如果提示找不到 pwsh,应检查是否安装PowerShell 7,以及程序是否已加入PATH;也可以先使用方法一完成测试。
HTTPS_PROXY 表示“访问HTTPS目标时使用哪个代理”,它的值可以是 http:// 地址。NO_PROXY 使用逗号分隔绕过代理的地址,不要直接照搬Windows设置中的分号列表或其他客户端的通配符写法。
在子进程中检查,然后回到父窗口恢复
在新进程中执行:
$Check = Invoke-RestMethod `
-Uri 'https://api.ipify.org?format=json' `
-TimeoutSec 30 -ErrorAction Stop
$Check.ip
此时不要再叠加方法二的默认参数,以免无法判断代理来自哪一层配置。
验证后输入 exit,回到刚才保存变量的父窗口,再运行:
foreach ($Name in $ProxyEnvNames) {
[Environment]::SetEnvironmentVariable(
$Name, $SavedProxyEnv[$Name], 'Process')
}
Remove-Variable SavedProxyEnv, ProxyEnvNames
这只恢复进程级变量,不修改持久化的用户级或机器级环境变量。具体代理选择规则可参阅 Microsoft HttpClient.DefaultProxy文档。
方法四:从PowerShell打开Windows系统代理设置
如果需要配置的是遵循Windows用户代理设置的桌面应用,可以直接打开系统设置页面:
Start-Process 'ms-settings:network-proxy'
也可以在开始菜单搜索“代理设置”。下图为Windows 10界面,Windows 11的按钮位置可能有所不同。

修改前,先记录原来的手动代理、自动检测和自动配置脚本状态。然后按以下顺序操作:
- 找到“手动设置代理”,开启“使用代理服务器”。Windows 11中可能需要先点击“设置”或“编辑”。
- 在“地址”中填写代理主机,在“端口”中填写对应端口。
- 仅将确实需要直连的地址加入例外列表,然后保存。

图中的代理开关处于关闭状态,输入框尚未启用;实际配置时需要先打开开关。地址栏不要拼接账号密码,系统页面通常也没有通用的代理密码输入框,认证由使用代理的应用处理。更多界面操作可参考 Windows代理设置文档。
保存后,要在真正需要代理的应用中验证。浏览器成功不等于脚本成功,脚本成功也不等于其他软件都已切换出口。测试结束后按之前记录恢复;如果电脑原本使用公司PAC自动配置脚本,不要简单关闭所有选项。
方法五:使用netsh配置WinHTTP代理
WinHTTP是Windows的一套HTTP客户端接口。只有目标程序读取WinHTTP默认配置时,下面的设置才有意义。netsh winhttp 不能让所有Windows软件自动走代理,也不能作为 Invoke-WebRequest 的通用代理开关。
先查看并备份现有配置
在具备相应权限的管理员PowerShell窗口中运行:
netsh winhttp show proxy
$BackupFile = Join-Path $env:TEMP (
'winhttp-{0}.txt' -f (Get-Date -Format 'yyyyMMdd-HHmmss'))
netsh winhttp dump | Set-Content -LiteralPath $BackupFile
$BackupFile
记录输出的备份路径,并确认文件确实包含配置命令。备份可能涉及内部服务器地址,应妥善保存。对于使用高级策略或自动配置的设备,应由管理员确认备份是否覆盖需要恢复的状态。
设置代理并检查结果
$ProxyAddress = Read-Host 'Proxy host:port (no scheme or password)'
netsh winhttp set proxy proxy-server="$ProxyAddress"
if ($LASTEXITCODE -ne 0) {
throw 'WinHTTP proxy update failed.'
}
netsh winhttp show proxy
这里输入的是 主机名:端口,不带 http:// 和密码。命令成功只说明配置已写入,之后还要执行目标服务的真实操作或检查服务日志。netsh winhttp set proxy 不负责通用地保存代理账号密码,认证仍需目标程序支持。
如果确实需要将当前用户的相关代理配置导入WinHTTP,可以执行:
netsh winhttp import proxy source=ie
这是一次导入,不会让两套配置持续同步。
恢复备份,而不是直接重置
在保存了 $BackupFile 的同一窗口中运行:
netsh exec "$BackupFile"
netsh winhttp show proxy
netsh winhttp reset proxy 会恢复直连,不等于“撤销上一步”。只有原配置确实是直连,而且需要恢复直连时才使用。完整参数见 Microsoft netsh winhttp文档。
PowerShell设置代理后不生效,应该怎么排查?
按“端口连通 → 代理认证 → HTTPS请求 → 目标业务响应”的顺序检查,比反复换IP更容易找到原因。
先检查端口,不要只看Ping
复用方法一中的 $ProxyUri:
Test-NetConnection -ComputerName $ProxyUri.DnsSafeHost `
-Port $ProxyUri.Port -InformationLevel Detailed
TcpTestSucceeded 为 True 仅表示TCP端口可连接,不代表代理认证、HTTPS隧道或业务访问已经成功。Ping失败也不能代替端口检测。如果PowerShell 7无法加载对应Windows模块,可以在Windows PowerShell 5.1中执行这一步。
再比较请求出口
在网络规则允许直连的情况下,可在新的PowerShell 7窗口中执行对照请求:
$Baseline = Invoke-RestMethod `
-Uri 'https://api.ipify.org?format=json' `
-NoProxy -TimeoutSec 30 -ErrorAction Stop
$Baseline.ip
-NoProxy 不适用于Windows PowerShell 5.1。它跳过的是Web命令自身的代理选择,不能关闭设备VPN或透明网关。
对照IP与代理请求不同,说明两次请求使用了不同出口;两者相同,则还要检查上游NAT、例外规则和请求路径,不能仅据此认定代理失败。该接口检查的是IPv4,不代表IPv6流量也已验证。
按错误类型处理并复测
| 现象 | 优先检查 | 处理后如何确认 |
|---|---|---|
407 Proxy Authentication Required |
代理账号密码、接入白名单、账户权限及可用状态 | 修正认证后,重新运行带 -ProxyCredential 的检测请求 |
| 域名解析失败 | 代理主机名是否拼错、客户端DNS是否正常;目标解析问题结合代理错误信息判断 | 确认相关域名可解析,再测试端口和完整请求 |
| 连接被拒绝或超时 | 主机、端口、协议是否对应,防火墙是否允许连接 | 先测TCP,再测HTTPS请求 |
| TLS或证书错误 | 系统时间、证书信任链、企业检查代理的证书部署 | 修复信任或协议配置后重新请求,保留证书校验 |
403 Forbidden |
响应正文、目标站权限及访问规则 | 按目标站要求调整访问,再确认业务数据是否有效 |
429 Too Many Requests |
请求频率、配额、Retry-After 响应头 |
降低频率,按指定时间等待;如需重试,应限制次数 |
| 浏览器正常,脚本失败 | 两者读取的代理配置和认证方式是否一致 | 用显式 -Proxy 单独验证脚本 |
| JSON解析报错,实际返回HTML | 是否收到登录页、网关错误页或访问限制页 | 先排除异常响应,再检查数据解析 |
代理认证使用 -ProxyCredential,目标服务认证使用 -Credential,两者不能混用。只有企业代理支持当前Windows身份认证时,才考虑 -ProxyUseDefaultCredentials,而且它不能与 -ProxyCredential 同时使用。Rola IP的代理账号并不等于Windows域账号。
排查时记录发生时间、PowerShell版本、协议、错误类型及脱敏连接信息即可,不要公开完整请求对象、密码或认证头。参数含义可查阅 Microsoft Invoke-WebRequest文档。
如何把代理配置用到实际脚本中
先用显式 -Proxy 完成一次请求,确认认证和出口;再将检测接口替换为实际业务URL,检查返回的数据是否符合预期。需要在同一个会话中反复调用时,再提取为默认参数;需要服务级配置时,先确认服务读取哪一套代理设置。
Windows PowerShell设置代理是否完成,最终看的是实际任务能否通过预期出口取得有效响应,以及配置能否按需恢复。保留最初设置、明确生效范围,并把检测请求与真实业务验证分开,后续排错会更容易。