Proxy 使用Powershell和代理访问web

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

我似乎无法使用Powershell访问网页。我不断得到一个“(407)代理身份验证要求”。我试过很多东西。我不知道代理是什么,也不知道它需要什么样的身份验证。我唯一可以访问的是IE,它使用脚本进行配置。我试着用了一些IP,但是没有成功。有什么想法吗

以下是我尝试的一个例子:

$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\u代理
    用于HTTP请求
  • HTTPS\u代理
    用于HTTPS请求
  • 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。这与原始问题中的内容相同#非常感谢你,你是冠军。