PowerShell, веб-запросы и прокси - PullRequest
34 голосов
/ 21 февраля 2009

При выполнении простого веб-запроса существует ли способ указать среде PowerShell просто использовать настройки прокси-сервера вашего Internet Explorer?

Мои настройки прокси-сервера контролируются сетевой политикой (или сценарием), и я не хочу вносить изменения в сценарии ps позже, если мне это не нужно.

UPDATE: Отличная информация от участников. Окончательный шаблон скрипта, который я буду использовать для этого, будет выглядеть примерно так:

$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

Ответы [ 5 ]

22 голосов
/ 14 февраля 2011

Несколько лучше следующее, которое также обрабатывает автоматически обнаруженные прокси:

$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
}
13 голосов
/ 21 февраля 2009

Непроверенные

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

...

8 голосов
/ 21 февраля 2009
$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
$proxy.useDefaultCredentials = $true
$wc = new-object system.net.webclient
$wc.proxy = $proxy
$wc.downloadString($url)
7 голосов
/ 08 мая 2015

Это намного позже, чем первоначальный вопрос, но все еще актуальный ответ для более поздних версий PowerShell. Начиная с версии 3, у нас есть два пункта, которые могут решить эту проблему:

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, как хотите. В какой области вы решите хранить это, это ваш выбор. Я поместил их в свой профиль $, поэтому мне больше никогда не придется устанавливать эти элементы в моих сценариях.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 18 июля 2017

Просто обновите URL своим собственным прокси-адресом: порт. Это позволяет PowerShellGet обходить прокси-сервер с использованием ваших локальных учетных данных. Если у вас нет требований к учетным данным, просто нажмите кнопку ОК, когда появится запрос на ввод пароля. Я переименовал эту коробку в «Закрыть это окно». Из-за этого скрипта вы также можете использовать другие менеджеры пакетов, например Chocolatey / Nuget, через прокси.

...