使用Powershell和Proxy访问Web

use*_*851 27 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.Net.WebRequest]::DefaultWebProxy
$wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$wc.DownloadString("http://stackoverflow.com")
Run Code Online (Sandbox Code Playgroud)

小智 58

我有一个类似的问题,只用两行powershell解决了它:

$browser = New-Object System.Net.WebClient
$browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 这与原始问题中已有的内容相同!#smh (2认同)

Dan*_*dré 15

我没有看到有人做过这样的事情,但有一种方法可以在你的Powershell脚本中做一个"全局设置"(我记得在本地开发构建之前用C#做这个).

[System.Net.WebRequest]::DefaultWebProxy = [System.Net.WebRequest]::GetSystemWebProxy()
[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
Run Code Online (Sandbox Code Playgroud)

这样,如果您不想使用代理详细信息更新所有WebClient,则可以覆盖全局设置(每次运行脚本时都必须这样做).但这假定Windows用户中记录的当前值对系统定义的代理服务器有效.

注意:我会说这只是一种快速而肮脏的方法,可以让PS脚本工作之前没有代理知道(比如Cake build).


Daw*_*žan 7

我知道这个问题专门针对 Powershell 2.0,但我想分享有关在 Powershell Core (6+) 中设置代理服务器的信息,因为在其他地方很难找到它。

\n

我同意 Dandr\xc3\xa9 的观点,最好的解决方案是配置默认代理服务器。我刚刚遇到了 Powershell Core (7.1) 的问题。我正在尝试 Dandr\xc3\xa9 的建议,但没有任何效果。经过几个小时的研究和调查,我发现 Powershell Core 可能不再用于System.Net.WebRequest发出 Web 请求,而是System.Net.Nett.HttpClient.

\n

当我配置了HttpClient默认代理服务器后Invoke-WebRequest,Powershell( 、PowerShellGet Find-Module、等)建立的所有 Web 连接Install-Module终于开始工作。

\n

为 Powershell Core 配置默认代理服务器

\n

如果您需要使配置永久化,只需将以下命令添加到您的 Powershell 配置文件中即可。

\n

配置特定的默认代理服务器

\n
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy(\'http://your-proxy\')\n
Run Code Online (Sandbox Code Playgroud)\n

如果需要设置特定端口,请将其添加到代理服务器 URI:http://proxy:1234

\n

配置用于验证代理的凭据

\n

如果它是身份验证代理,您需要设置用于代理身份验证的凭据。使用以下命令设置您当前登录 Windows 的域帐户的凭据:

\n
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials\n
Run Code Online (Sandbox Code Playgroud)\n

如果您需要不同的凭据,可以使用 cmdlet Get-Credential但它是交互式的,因此它不是 Powershell 配置文件中的理想解决方案。但我确信还有其他方法。

\n
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = Get-Credential\n
Run Code Online (Sandbox Code Playgroud)\n

配置代理服务器绕过

\n

如果您只需要绕过代理服务器并使用直接连接,但 Powershell 使用默认的系统范围代理服务器,只需将HttpClient\ 的默认代理设置为null

\n
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy($null)\n
Run Code Online (Sandbox Code Playgroud)\n

将代理配置添加到 Powershell 配置文件

\n

要使配置永久化,只需将所需的命令添加到Powershell 配置文件中即可。其中有四个(所有用户,所有主机所有用户,当前主机当前用户,所有主机当前用户,当前主机),但我会使用“当前用户,所有主机”。要查找特定配置文件的位置,请使用$Profile带有配置文件名称的变量:

\n
$Profile.CurrentUserAllHosts\n
Run Code Online (Sandbox Code Playgroud)\n

它应该打印路径$Home\\Documents\\Powershell\\profile.ps1

\n

如果配置文件尚不存在,只需创建它并将配置放在那里。每次执行新的 Powershell Core ( pwsh.exe) 实例时都会执行它。

\n

使用环境变量配置默认代理

\n

另一种解决方案是使用环境变量。根据文档HttpClient实际上是使用以下变量来初始化默认代理(如果定义了它们):

\n
    \n
  • HTTP_PROXY对于 HTTP 请求
  • \n
  • HTTPS_PROXY对于 HTTPS 请求
  • \n
  • ALL_PROXY适用于 HTTP 和 HTTPS
  • \n
  • NO_PROXY可能包含从代理中排除的主机名的逗号分隔列表
  • \n
\n

用法示例:

\n
ALL_PROXY=\'http://proxy:1234\'\n
Run Code Online (Sandbox Code Playgroud)\n

如果您需要传递凭据:

\n
ALL_PROXY=\'http://username:password@proxy:1234\'\n
Run Code Online (Sandbox Code Playgroud)\n

该解决方案受到更广泛的应用程序的支持,因此它比以前的解决方案更好还是更差取决于您到底要配置什么,只是 Powershell 还是其他应用程序。

\n


Col*_*ban 5

如果代理回答“ 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)
Run Code Online (Sandbox Code Playgroud)

内容现在位于“ test.xml”中


And*_*huk 0

如果您知道该脚本 - 只需下载它,用记事本打开并找到代理服务器的 IP 和端口。至于身份验证 - 最有可能使用您的 Windows 凭据,因此理论上您应该能够将其保留为空,除非脚本中存在可疑内容。