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?

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


person Philippe    schedule 24.11.2018    source источник


Ответы (4)


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

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

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

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

person Alex KeySmith    schedule 26.11.2018
comment
Алекс, просто взгляните на мой комментарий выше :-) - person Philippe; 28.11.2018
comment
VSCode становится отличным редактором для powershell, я склонен смешивать и сочетать его с ISE. Хорошая вещь в погружении в .net заключается в том, что приведенный выше код все еще powershell, он просто напрямую использует классы .net. - person Alex KeySmith; 28.11.2018

Я знаю, что это довольно старо, но, поскольку мне тоже нравятся хорошие решения, я опубликую свое решение в этой теме. Я действительно использовал это, и это сработало отлично (также для 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.

person Mr-Fly    schedule 24.02.2021

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

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

Update-Proxy.ps1

Согласно этим вопросам и ответам

Обход прокси-сервера Invoke-WebRequest

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

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

person postanote    schedule 25.11.2018
comment
Я пытался, пока без особых результатов... Я серьезно рассматриваю возможность перехода на PowerShell v6, но это займет некоторое время. Я опубликую дополнительный ответ, как только это будет сделано, но это займет некоторое время... В моем случае прокси-сервер задерживает меня примерно на 7 секунд :-( - person Philippe; 27.11.2018
comment
Да, улучшенные веб-командлеты — это то, для чего я использую PSCore и все, что связано с Azure Shell, но не более того. Для меня у меня слишком много инвестиций в Windows PS, которая никогда не будет работать и никогда не будет перенесена на v6. Особенно любой материал с графическим интерфейсом WF/WPF, поскольку в PSCore нет графического интерфейса. Эта задержка прокси-сервера звучит так, как будто ваша организация использует интенсивную веб-фильтрацию (вход/выход, возможно, стек WebSense) по сравнению с прозрачным прокси-сервером, что приводит к этой задержке. Вы мало что можете с этим поделать, кроме как лоббировать их, чтобы ослабить ограничения на пункты назначения, которые вы пытаетесь посетить. - person postanote; 27.11.2018
comment
Спасибо за оба ваших ответа, я нахожусь в процессе детализации :-) Я также начал изучать, что Microsoft делает со своим кодом Visual Sutdio [ссылка]code.visualstudio.com Это действительно впечатляет, и Powershell ISE теперь является частью этой среды. Я посмотрю и вернусь к вам. - person Philippe; 28.11.2018

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

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

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

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

В моем случае работает отлично!!!

person Philippe    schedule 29.11.2018