【问题标题】:Access web using Powershell and Proxy使用 Powershell 和代理访问 Web
【发布时间】:2012-12-25 03:52:19
【问题描述】:

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

【问题讨论】:

  • 任何带有完整源代码示例的最终解决方案?
  • 我也试过上面的代码和几个变种,总是得到 407 错误。

标签: proxy powershell-2.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    $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)
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,只用了两行 powershell 就解决了:

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

      希望这会有所帮助。

      【讨论】:

      • 在 PowerShell 2 中对我不起作用。仍然得到“(407) 需要代理身份验证。” Win7、IE11。
      • 这与原始问题中的内容相同! #smh
      【解决方案4】:

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

      $client.Credentials = Get-Credential
      

      【讨论】:

      • 当所有其他安装 Leiningen 的方法 (lein self-install) 都失败时,这对我有用。我刚刚将此更改编辑为lein.bat
      【解决方案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)
      

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

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

        • 非常感谢,你是冠军。
        【解决方案7】:

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

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

        当我配置好HttpClient's default proxy server后,Powershell建立的所有网络连接(Invoke-WebRequest、PowerShellGet的Find-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-Credential cmdlet,但它是交互式的,因此它不是您的 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 变量:

        $Profile.CurrentUserAllHosts
        

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

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

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

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

        • 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 或其他应用程序。

        【讨论】:

          【解决方案8】:

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

          1. $proxy='http://username:password@IP:PORT'
          2. $ENV:HTTP_PROXY=$proxy
          3. $ENV:HTTPS_PROXY=$proxy

          【讨论】:

            猜你喜欢
            • 2010-10-08
            • 2012-10-29
            • 1970-01-01
            • 1970-01-01
            • 2022-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多