35

发出简单的Web 请求时,有没有办法告诉 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
4

6 回答 6

24

更好的是以下,它也处理自动检测的代理:

$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
}
于 2011-02-14T14:52:28.043 回答
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)

...

于 2009-02-20T22:37:23.180 回答
12

这比原始问题晚得多,但对于更高版本的 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 中,所以我再也不用在我的脚本中设置这些项目了。

希望这对某人有帮助!

于 2015-05-08T15:54:19.073 回答
11
$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
$proxy.useDefaultCredentials = $true
$wc = new-object system.net.webclient
$wc.proxy = $proxy
$wc.downloadString($url)
于 2009-02-21T17:20:05.837 回答
1

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

$uri = "http://www.google.com"
invoke-webrequest -ProxyUseDefaultCredentials -proxy (new-object System.Net.WebClient).Proxy.GetProxy($uri).AbsoluteUri $uri
于 2020-04-22T22:59:31.537 回答
-1

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

于 2017-07-18T06:37:57.610 回答