Proxy 使用Powershell和代理访问web
我似乎无法使用Powershell访问网页。我不断得到一个“(407)代理身份验证要求”。我试过很多东西。我不知道代理是什么,也不知道它需要什么样的身份验证。我唯一可以访问的是IE,它使用脚本进行配置。我试着用了一些IP,但是没有成功。有什么想法吗 以下是我尝试的一个例子:Proxy 使用Powershell和代理访问web,proxy,powershell-2.0,Proxy,Powershell 2.0,我似乎无法使用Powershell访问网页。我不断得到一个“(407)代理身份验证要求”。我试过很多东西。我不知道代理是什么,也不知道它需要什么样的身份验证。我唯一可以访问的是IE,它使用脚本进行配置。我试着用了一些IP,但是没有成功。有什么想法吗 以下是我尝试的一个例子: $wc = New-Object System.Net.WebClient $wc.Headers.Add("User-Agent","Mozilla/4.0+") $wc.Proxy = [System.N
$wc = New-Object System.Net.WebClient
$wc.Headers.Add("User-Agent","Mozilla/4.0+")
$wc.Proxy = [System.Net.WebRequest]::DefaultWebProxy
$wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$wc.DownloadString("http://stackoverflow.com")
如果您知道该脚本,只需下载它,用记事本打开并查找代理服务器的IP和端口。至于身份验证-很可能您的windows凭据已被使用,因此理论上您应该能够将其保留为空,除非脚本中有可疑内容。尝试添加缓存凭据
$domain = 'ChDom'
$Client = new-object System.Net.WebClient
$cc = New-object System.Net.CredentialCache
$urlObj = New-object System.Uri($url)
#these variables must be plaintext strings
$creds = New-object System.Net.NetworkCredential($Username,$Password)
#your auth might be different than mine
$cc.add($urlobj,"NTLM",$creds)
$client.Credentials = $cc
$Client.Downloadfile($url, C:\Temp\TestPage.html)
我遇到了一个类似的问题,仅使用两行powershell就解决了它:
$browser = New-Object System.Net.WebClient
$browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials
希望这有帮助。如果您使用以下选项,您将收到输入凭据的提示:
$client.Credentials = Get-Credential
ALL_PROXY='http://username:password@proxy:1234'
如果代理回答“407”,“需要代理验证”,则需要验证:
$Username="Hugo"
$Password="abcdefgh"
$WebProxy = New-Object System.Net.WebProxy("http://webproxy:8080",$true)
$url="http://aaa.bbb.ccc.ddd/rss.xml"
$WebClient = New-Object net.webclient
$WebClient.Proxy=$webproxy
$WebClient.proxy.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
$path="C:\Users\hugo\xml\test.xml"
$WebClient.DownloadFile($url, $path)
内容现在驻留在“test.xml”中我还没有看到任何人做过类似的事情,但有一种方法可以在Powershell脚本中作为“全局设置”来做这件事(我记得以前在C#中为本地开发版本做过这件事)
[System.Net.WebRequest]::DefaultWebProxy=[System.Net.WebRequest]::GetSystemWebProxy()
[System.Net.WebRequest]::DefaultWebProxy.Credentials=[System.Net.CredentialCache]::DefaultNetworkCredentials
这样,如果您不想用代理详细信息更新所有WebClient,您可以覆盖全局设置(必须在每次运行脚本时完成)。
但这假定当前登录的Windows用户对系统定义的代理服务器有效
注意:我想说的是,这只是一种快速而肮脏的方法,可以让以前不支持代理的PS脚本工作(如)。我知道这个问题是专门针对Powershell 2.0的,但我想与大家分享有关在Powershell Core(6+)中设置代理服务器的信息因为在别处很难找到 我同意Dandré的观点,即最好的解决方案是配置默认代理服务器。我刚刚遇到了Powershell Core(7.1)的问题。我完全按照丹德雷的建议去做,但没有任何效果。经过几个小时的研究和调查,我发现Powershell Core可能不再使用
System.Net.WebRequest
来发出web请求,而是使用
配置后,Powershell建立的所有web连接(调用WebRequest
、PowerShellGet的查找模块
、安装模块
)最终开始工作
为Powershell核心配置默认代理服务器
如果需要将配置永久化,只需将下面的命令添加到Powershell配置文件中即可
配置特定的默认代理服务器
如果需要设置特定端口,请将其添加到代理服务器URI:http://proxy:1234
配置用于验证代理的凭据
如果是身份验证代理,则需要设置用于代理身份验证的凭据。使用以下命令设置当前登录到Windows的域帐户的凭据:
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
如果您需要不同的凭据,可以使用,但它是交互式的,因此它不是Powershell配置文件中的理想解决方案。但我相信还有其他方法
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = Get-Credential
配置代理服务器旁路
如果您只需要绕过代理服务器并使用直接连接,但Powershell正在使用默认的系统范围代理服务器,只需将HttpClient
的默认代理设置为null
:
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy($null)
将代理配置添加到Powershell配置文件
要使配置永久化,只需将所需的命令添加到配置中即可。其中有四个(所有用户,所有主机;所有用户,当前主机;当前用户,所有主机;当前用户,当前主机),但我会使用“当前用户,所有主机”。要查找特定配置文件的位置,请使用带有配置文件名称的$profile
变量:
$Profile.CurrentUserAllHosts
它应该打印路径$Home\Documents\Powershell\profile.ps1
如果配置文件还不存在,只需创建它并将配置放在那里。每次执行新的Powershell Core(pwsh.exe
)实例时,都会执行该命令
使用环境变量配置默认代理
另一种解决方案是使用环境变量。根据HttpClient的定义,如果定义了以下变量,则实际上使用这些变量初始化默认代理:
用于HTTP请求HTTP\u代理
用于HTTPS请求HTTPS\u代理
- HTTP和HTTPS的
ALL_代理
可能包含一个逗号分隔的主机名列表,该列表不包含代理NO_PROXY
ALL_PROXY='http://proxy:1234'
如果您需要传递凭据:
$client.Credentials = Get-Credential
ALL_PROXY='http://username:password@proxy:1234'
此解决方案受范围更广的应用程序支持,因此,与上一个解决方案相比,它的优劣取决于您想要配置的具体内容,仅限于Powershell或其他应用程序。是否有完整源代码示例的最终解决方案?我也尝试了上述代码和一些变体,总是收到407错误。当所有其他安装Leiningen的方法(
lein self-install
)失败时,这对我来说很有效。我刚刚将此更改编辑为lein.bat
。在PowerShell 2中对我不起作用。仍然需要获取“(407)代理身份验证。”Win7,IE11。这与原始问题中的内容相同#非常感谢你,你是冠军。