2009-02-20 10 views
31

При создании простого web request есть ли способ сказать окружению PowerShell просто использовать настройки прокси-сервера Internet Explorer?PowerShell, веб-запросы и прокси

Мои настройки прокси-сервера контролируются сетевой политикой (или скриптом), и я не хочу, чтобы впоследствии менять скрипты 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 

ответ

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) 

...

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) 
+0

Это не сработает для меня. Вместо чтения веб-страницы он читает прокси-запрос для учетных данных :( – Bluz

+0

Попробуйте установить свои учетные данные через $ proxy.credentials (и установите $ proxy.useDefaultCredentials в значение $ false), YMMV. –

+0

Nice one Shay, это было умно, но, к сожалению, я все равно получаю одну и ту же страницу :(Я думаю, что я просто использую старый способ сделать это и скопировать вставку html, который я хочу в текстовый файл, и взять его оттуда. Это – Bluz

17

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

$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 
} 
+0

Когда вы говорите «автообнаруженные прокси», вы имеете в виду сценарии автоматической настройки (как опция вызывается в Internet Explorer)? – Chris

+0

Я так думаю, да (давно Я написал это :-)) –

+0

Обратите внимание, что это не работает на PS 2.0. Я думаю, что есть ошибка в том, как NTLM обрабатывается WebClient для более старых версий .net, поэтому ... да, убедитесь, что у вас есть последняя версия PS для этого. – Nacht

7

Это гораздо позже, чем оригинальный вопрос, но все-таки соответствующий ответ для более поздних версий 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

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