【问题标题】:PowerShell, Web Requests, and ProxiesPowerShell、Web 请求和代理
【发布时间】:2010-10-08 22:58:16
【问题描述】:

在制作简单的web request 时,有没有办法告诉 PowerShell 环境只使用 Internet Explorer 的代理设置?

我的代理设置由网络策略(或脚本)控制,如果我不需要,我不想稍后修改 ps 脚本。

更新: 来自参与者的重要信息。我将用于此的最终脚本模板如下所示:

$proxyAddr = (get-itemproperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings').ProxyServer
$proxy = new-object System.Net.WebProxy
$proxy.Address = $proxyAddr
$proxy.useDefaultCredentials = $true

$url = "http://stackoverflow.com"
$wc = new-object system.net.WebClient
$wc.proxy = $proxy
$webpage = $wc.DownloadData($url)
$str = [System.Text.Encoding]::ASCII.GetString($webpage)
Write-Host $str

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    以下内容更好一些,它也可以处理自动检测到的代理:

    $proxy = [System.Net.WebRequest]::GetSystemWebProxy()
    $proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
    
    $wc = new-object system.net.WebClient
    $wc.proxy = $proxy
    $webpage = $wc.DownloadData($url)
    

    (编辑)除上述之外,这个定义似乎对我也适用:

    function Get-Webclient {
        $wc = New-Object Net.WebClient
        $wc.UseDefaultCredentials = $true
        $wc.Proxy.Credentials = $wc.Credentials
        $wc
    }
    

    【讨论】:

    • 当您说auto-detected proxies 时,您的意思是自动配置脚本(在 Internet Explorer 中调用该选项)?
    • 我想是的,是的(我已经很久没有写了:-))
    • 请注意,这似乎不适用于 PS 2.0。我认为 WebClient 如何处理旧 .net 版本的 NTLM 存在一个错误,所以...是的,请确保您有最新版本的 PS 来执行此操作。
    • 哦,顺便说一句,谢谢我多年来一直需要解决这个问题。我以为我已经尝试了 API 调用的每一种组合,但这就是最终让它工作的原因(加上 PS v4)
    • 这很旧,但在使用 powershell 5.1 的 windows 10 机器上对我来说非常有效。
    【解决方案2】:

    未经测试

    $user = $env:username
    $webproxy = (get-itemproperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings').ProxyServer
    $pwd = Read-Host "Password?" -assecurestring
    
    $proxy = new-object System.Net.WebProxy
    $proxy.Address = $webproxy
    $account = new-object System.Net.NetworkCredential($user,[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd)), "")
    $proxy.credentials = $account
    
    $url = "http://stackoverflow.com"
    $wc = new-object system.net.WebClient
    $wc.proxy = $proxy
    $webpage = $wc.DownloadData($url)
    $string = [System.Text.Encoding]::ASCII.GetString($webpage)
    

    ...

    【讨论】:

      【解决方案3】:

      这比最初的问题要晚得多,但对于更高版本的 PowerShell 来说仍然是一个相关的答案。从 v3 开始,我们有两个项目可以解决这个问题:

      Invoke-WebRequest - 几乎在所有场景中都使用 system.net.webclient 替代

      $PSDefaultParameterValues - 可以存储参数的详细信息

      如何结合使用,解决原来由网络策略(或脚本)控制的代理设置问题,以后不用修改ps脚本?

      Invoke-WebRequest 带有 -Proxy 和 -ProxyUseDefaultCredentials 参数。

      我们将这些参数的答案存储在 $PSDefaultParameterValues 中,如下所示: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

      您可以随意将“http://###.###.###.###:80”替换为 $proxyAddr。您选择将其存储在什么范围内,是您的选择。我把它们放到了我的 $profile 中,所以我再也不用在我的脚本中设置这些项目了。

      希望这对某人有所帮助!

      【讨论】:

        【解决方案4】:
        $proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
        $proxy.useDefaultCredentials = $true
        $wc = new-object system.net.webclient
        $wc.proxy = $proxy
        $wc.downloadString($url)
        

        【讨论】:

        • 这对我不起作用。它不是读取网页,而是读取凭据的代理提示:(
        • 尝试通过 $proxy.credentials 设置您的凭据(并将 $proxy.useDefaultCredentials 设置为 $false),YMMV。
        • 不错的谢伊,这很聪明,但不幸的是我仍然得到相同的页面:(我想我会使用旧的方法并将我想要的 html 复制粘贴到文本文件中,然后从那里拿走。无论如何,这是一个一次性脚本。感谢您的帮助!
        【解决方案5】:

        我知道这真的很老了,但有一个正确的方法,似乎很少有人知道它。下面将找出您感兴趣的 URI 的代理是什么并使用它。

        $uri = "http://www.google.com"
        invoke-webrequest -ProxyUseDefaultCredentials -proxy (new-object System.Net.WebClient).Proxy.GetProxy($uri).AbsoluteUri $uri
        

        【讨论】:

          【解决方案6】:

          只需使用您自己的代理地址更新 URL:端口。它使 PowerShellGet 能够使用您的本地凭据通过代理。如果您没有凭据要求,只需在提示您输入密码时单击“确定”。我将该框重命名为“关闭此窗口”。由于此脚本,您还可以通过代理使用其他包管理器,例如 Chocolatey/Nuget。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-25
            • 1970-01-01
            • 1970-01-01
            • 2016-09-14
            • 1970-01-01
            • 2014-09-16
            相关资源
            最近更新 更多