33

我似乎无法使用 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")
4

9 回答 9

76

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

$browser = New-Object System.Net.WebClient
$browser.Proxy.Credentials =[System.Net.CredentialCache]::DefaultNetworkCredentials 

希望这可以帮助。

于 2014-08-01T14:33:47.290 回答
25

我还没有看到有人在做这样的事情,但是有一种方法可以在你的 Powershell 脚本中作为“全局设置”来做到这一点(我记得之前在 C# 中为本地开发构建做过这个)。

[System.Net.WebRequest]::DefaultWebProxy = [System.Net.WebRequest]::GetSystemWebProxy()
[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

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

注意:我想说这只是作为一种快速而肮脏的方式来让 PS 脚本工作,而之前不知道代理(比如Cake build)。

于 2016-12-15T15:15:32.850 回答
7

如果代理回答“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”中

于 2016-02-04T13:27:59.933 回答
2

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

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

当我配置好HttpClient默认代理服务器后,所有由 Powershell(Invoke-WebRequest、PowerShellGetFind-ModuleInstall-Module)建立的网络连接终于开始工作了。

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

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

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

[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy('http://your-proxy')

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

配置身份验证代理的凭据

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

[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

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

[System.Net.Http.HttpClient]::DefaultProxy.Credentials = Get-Credential

配置代理服务器绕过

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

[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy($null)

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

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

$Profile.CurrentUserAllHosts

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

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

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

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

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

一个示例用法:

ALL_PROXY='http://proxy:1234'

如果您需要传递凭据:

ALL_PROXY='http://username:password@proxy:1234'

此解决方案受到更广泛的应用程序的支持,因此它比以前的解决方案好还是坏取决于您要配置的确切内容,仅 Powershell 或其他应用程序。

于 2021-05-18T14:27:52.323 回答
1

如果您使用以下内容,您将收到输入凭据的提示:

$client.Credentials = Get-Credential
于 2014-11-20T12:36:34.243 回答
0

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

于 2013-01-16T13:24:47.657 回答
0

尝试添加缓存凭据....

$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)
于 2013-02-05T22:45:47.753 回答
0

Option 1 - Setting Proxy Authentication via Code.

  • Another Authenticated Proxy Example With Credentials

      # 1). Set your http proxy address and port
    $proxy = New-Object System.Net.WebProxy("http://p.weshare.net:80",$true)
    
     # 2). Set your http proxy credentials
    $proxy.Credentials = New-Object System.Net.NetworkCredential("username", "password")
    
     # 3). Set the global proxy
    [System.Net.WebRequest]::DefaultWebProxy = $proxy
    
     # 4). sets a value that indicates whether to bypass the proxy server for local addresses.
    [System.Net.WebRequest]::DefaultWebProxy.BypassProxyOnLocal = $true
    
     # 5). Call Invoke-WebRequest without -Proxy Tag ( as it pulls it from what you defined )
    $reposnseText = Invoke-WebRequest https://www.oracle.com
    

  1. Just wrapping it as a Function

    Function Set-My-Proxy { param($proxy,$username,$password)

      $proxy = New-Object System.Net.WebProxy($proxy,$true)
      $proxy.Credentials = New-Object System.Net.NetworkCredential($username, $password)
      [System.Net.WebRequest]::DefaultWebProxy = $proxy
      [System.Net.WebRequest]::DefaultWebProxy.BypassProxyOnLocal = $true
    

    }

  2. Call the Function

    Set-My-Proxy 'http://p.weshare.net:80' 'username' 'password'


Option 2 - Setting Proxy Authentication via Another Proxy

Credits & Limitations of solution

  1. Install local proxy, e.g : squid for windows

  2. After installing, open squid.conf file ( right mouse click on squid icon on task bar -> Open Squid Configuration

  3. Put the following code please provide authenticated proxy ip only ( in our example : 10.1.2.3 - not domain one )

    http_access allow all
    http_port 3128
    
    coredump_dir /var/spool/squid3
    refresh_pattern ^ftp:       1440    20% 10080
    refresh_pattern ^gopher:    1440    0%  1440
    refresh_pattern -i (/cgi-bin/|\?) 0 0%  0
    refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
    refresh_pattern .       0   20% 4320
    
    cache_peer 10.1.2.3 parent 80 0 no-query default login=my_username:my_password
    
    never_direct allow all
    access_log none
    cache_log none
    
  4. Restart Squid Service

  5. You now may call your local proxy, which will forward request to authenticated proxy and response back

    Invoke-WebRequest -Uri 'https://stackoverflow.com/' -Proxy 'http://127.0.0.1:3128'
    
于 2022-01-12T12:41:43.370 回答
0

我只用三行解决了这个问题:

  1. $proxy='http://username:password@IP:PORT'
  2. $ENV:HTTP_PROXY=$proxy
  3. $ENV:HTTPS_PROXY=$proxy
于 2021-11-17T07:53:27.973 回答