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 с помощью этой функции:
Согласно этому 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
Прекрасно работает в моем случае!