Powershell v5.1 Invoke-RestMethod и обходной прокси

Я в настоящее время нахожусь в Powershell V5.1 и хотел бы обойти прокси Internet Explorer по команде Invoke-RestMethod.

В Powershell V6 есть параметр -NoProxy, который указывает, что командлет не будет использовать прокси для достижения места назначения. Это для того, чтобы обойти прокси, настроенный в Internet Explorer, и это именно то, что я хочу сделать.

В Powershell V6 код будет выглядеть примерно так:

$Result = Invoke-RestMethod -Uri $url  -NoProxy

Любой обходной путь в V5.1?

Спасибо Филипп

4 ответа

Я знаю, что это довольно давно, но поскольку мне тоже нравятся хорошие решения, я опубликую свои в этой теме. Я действительно использовал это, и он отлично работал (также для Invoke-WebRequest):

          $Proxy=New-object System.Net.WebProxy
    $WebSession=new-object Microsoft.PowerShell.Commands.WebRequestSession
    $WebSession.Proxy=$Proxy
    $Antwort=Invoke-RestMethod -Method Post -Uri "https://thisismyrestsite" -Body $BodyJson -WebSession $WebSession

Может быть, это кому-то поможет, так как хороших решений в сети пока не нашел. Если кому-то нужны особые настройки прокси, я считаю, что он также может заполнить $Proxy значениями, которые могут позволить больше настроек, чем Invoke-RestMethod или Invoke-WebRequest.

Как альтернатива, но я думаю, что у postanote есть отличный ответ. Как насчет погружения в.net? И на более глубоком уровне, чем обычно в наши дни, вместо использования HttpClient.net с помощью WebRequest:

$request = [System.Net.WebRequest]::Create("https://www.example.org")
$request.Proxy = [System.Net.WebProxy]::new() #blank proxy
$response = $request.GetResponse()
$response

Я не тестировал подробно, если это обойти прокси (моя корпоративная политика сделает это сложно для тестирования), но этот вопрос на C# предполагает, что он должен делать: Как удалить прокси из WebRequest и оставить DefaultWebProxy нетронутым

Конечно, вы потеряли бы некоторую магию конвейерной обработки в PowerShell, но вы могли бы достаточно легко обернуть ее, следя за использованием сокетов, если вы используете это под большой нагрузкой.

Не изначально, поскольку это были некоторые улучшения, в веб-командлетах PSCore и MS заявили, что ничего не будет перенесено. Вы можете просто раскошелиться на PSCore из PS5x, чтобы использовать командлет как есть.

Нечто подобное было сделано для Invoke-WebRequest с помощью этой функции:

Update-Proxy.ps1

Согласно этому Q & A

Invoke-WebRequest Proxy Bypass

   $p = proxy
   $p.Override += "*.domain.com" 
   $p | proxy
   Invoke-WebRequest ...
   #you could return old override here.

Таким образом, он может работать с Invoke-RestMethod, но я не в месте, чтобы проверить это.

Итак, вот обходной путь, который я реализовал очень успешно:

Конец веб-запроса обычно игнорируется запрашиваемым сайтом (пожалуйста, проверьте, но это очень часто верно). Итак, я добавляю что-то случайное в конце моего URL: метку времени.

Прокси-сервер считает, что это новый запрос каждый раз, поэтому кэширование не происходит.

$timestamp = (Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s)
$url = "https://www.example.org/$timestamp"
$Result = Invoke-RestMethod -Uri $url

Прекрасно работает в моем случае!

Другие вопросы по тегам