Подтвердить что ты не робот

PowerShell, веб-запросы и прокси

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

Настройки моего прокси-сервера контролируются сетевой политикой (или script), и я не хочу, чтобы впоследствии менять скрипты ps, если мне это не нужно.

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

$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
4b9b3361

Ответ 1

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

$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

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

$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

$wc = new-object system.net.WebClient
$wc.proxy = $proxy
$webpage = $wc.DownloadData($url)

(edit) В дополнение к вышесказанному, это определение, похоже, отлично работает и для меня:

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

Ответ 3

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

Ответ 4

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

Invoke-WebRequest - который заменяет using system.net.webclient почти для каждого сценария

$PSDefaultParameterValues ​​ - который может хранить детали для параметров

Как использовать их вместе для решения исходной проблемы настроек прокси-сервера, управляемой сетевой политикой (или script), и не нужно позже изменять скрипты ps?

Invoke-WebRequest поставляется с параметрами -Proxy и -ProxyUseDefaultCredentials.

Мы сохраняем наши ответы на эти параметры в $PSDefaultParameterValues, например: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

Вы можете заменить 'http://###.###.###.###:80 на $proxyAddr, как и вы. Какую область вы хотите сохранить, это ваш выбор. Я помещаю их в свой профиль $, поэтому мне больше не нужно устанавливать эти элементы в мои скрипты.

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

Ответ 5

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