制作简单的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
答案 0 :(得分:21)
以下情况更好一些,它也处理自动检测到的代理:
$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
}
答案 1 :(得分:13)
未测试:
$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)
...
答案 2 :(得分:8)
$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
$proxy.useDefaultCredentials = $true
$wc = new-object system.net.webclient
$wc.proxy = $proxy
$wc.downloadString($url)
答案 3 :(得分:7)
这比原始问题要晚得多,但对于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 :(得分:1)
我知道这真的很老,但是有一个正确的方法,似乎很少有人知道。下面将说明您感兴趣的URI的代理是什么,并使用它。
$uri = "http://www.google.com"
invoke-webrequest -ProxyUseDefaultCredentials -proxy (new-object System.Net.WebClient).Proxy.GetProxy($uri).AbsoluteUri $uri
答案 5 :(得分:-1)
只需使用您自己的代理地址更新URL:port。它使PowerShellGet能够使用您的本地凭据通过代理。如果您没有凭据要求,只需在提示输入密码时单击“确定”。我将该框重命名为"关闭此窗口"。由于此脚本,您还可以通过代理使用其他包管理器,如Chocolatey / Nuget。