Использование PowerShell через прокси сервер

Если ваш компьютер находится в сети за прокси сервером, вы получите ряд проблема при доступе из сессии PowerShell к внешним ресурсам. Например, вы не сможете получить содержимое внешней веб-страницы с помощью командлета Invoke-WebRequest , обновить справку с помощью Update-Help, подключиться к тенанту Azure/Microsoft 365 ( модуль Exchange Online PowerShell ), установить модули из PSGallery, или компоненты RSAT , или загрузить пакет с приложением из внешнего репозитория пакетов (с помощью PackageManagement или winget ). В этой статье мы разберемся, как из настроить PowerShell для доступа в Интернет через прокси-сервер с аутентификацией.

Попробуйте обновить справку Powershell:

Update-Help

Или обратиться к внешней веб-странице:

Invoke-WebRequest https://remontka.com

При отсутствии прямого выхода в Интернет команда вернет такую ошибку:

update-help : Failed to update Help for the module(s) 'DhcpServer, DirectAccessClientComponents….’  with UI culture(s) {en-US} : Unable to connect to Help content. The server on which Help content is stored might not be available. Verify that the server is available, or wait until the server is back online, and then try the command again.
Invoke-WebRequest: Unable to connect to the remote server

Find-Module modulename

Unable to resolve package source 'https://www.powershellgallery.com/api/v2'

не работает powershell через прокси -сервер

Дело в том, что Powershell (а точнее класс .NET System.Net.WebClient , который используют все командлеты при обращении к внешним ресурсам по HTTP/HTTPS) не использует настройки прокси-сервера, заданные в параметрах пользователя. Рассмотрим, как настроить задать параметры прокси сервера и выполнить аутентификацию из консоли PoweShell.

Настройка параметров подключения к прокси-серверу в PowerShell

Проверьте текущие настройки системного прокси в сессии Powershell:

netsh winhttp show proxy

Как вы видите, настройки прокси не заданы.

Current WinHTTP proxy settings:_x000D_Direct access (no proxy server).

netsh winhttp show proxy текущие настройки прокси

Можно импортировать настройки прокси-сервера из настроек Windows (Internet Explorer):

netsh winhttp import proxy source=ie

или задать их вручную:

netsh winhttp set proxy "192.168.0.14:3128"

netsh winhttp set proxy - задать настройки прокси вручную

Вы можете задать список IP адресов или имен сайтов, для подключения к которым не нужно использовать прокси-сервер (bypass list):

netsh winhttp set proxy "192.168.0.14:3128" bypass-list= "10.*,172.*,192.168.*,*.corp.remontka.com"

Настройки winnhttp прокси на компьютерах домен а можно задать централизованно с помощью GPO.

Вы можете проверить, выполняется ли подключение к определённому URL адресу через прокси или нет. Выполните команду:

([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("https://remontka.com")

проверить подключение в Интернет через прокси из powershell

Если команда вернула False , значит подключение к этому URL будет выполнено через прокси-сервер, заданный в сесии PowerShell.

Если на прокси-сервере требуется аутентификация, то при выполнении запросов PowerShell будут появляться ошибки “ (407) Proxy Authentication Required ”. Например, при попытке подключиться к своей тенанту Azure с помощью модуля AzureAD :

Connect-AzureAD

Я получаю ошибку:

The remote server returned an error: (407) Proxy Authentication Required.Далее рассмотрим, как аутентифицироваться на прокси сервере из PowerShell.

Аутентификация на прокси сервере из PowerShell

Рассмотрим два способа аутентификации на прокси-сервере: вы можете использовать SSO аутентификацию, или указать имя и пользователя для аутентификации вручную.

Если вы авторизованы в системе под доменной учетной записью, и ваш прокси поддерживает Active Directory аутентификацию Kerberos, или NTLM (если вы его еще не отключили ), то для аутентификации на прокси-сервере можно воспользоваться учетными данными текущего пользователя (вводить имя/пароль не потребуется):

$Wcl = new-object System.Net.WebClient
$Wcl.Headers.Add(“user-agent”, “PowerShell Script”)
$Wcl.Proxy.Credentials =
[System.Net.CredentialCache]::DefaultNetworkCredentials

Если нужно вручную аутентифицироваться на прокси-сервере, выполните следующие команды. Указав имя и пароль пользователя в окне Windows Security credential request.

$Wcl=New-Object System.Net.WebClient
$Creds=Get-Credential
$Wcl.Proxy.Credentials=$Creds

powershell введите пароль для аутентфикации на прокси сервере

Теперь можно попробовать обратится к внешнему сайту или обновить справку командой Update-Help.

invoke-webrequest работает через прокси-сервер

Как вы видите, командлет Invoke-Web Request вернул данные со страницы внешнего сайта!

С помощью PowerShell вы можете проверить свой внешний IP адрес , под которым вы выходите в интернет. Если вы настроили подключение через прокси, команда должна вернуть внешний IP адрес вашего прокси сервера:

(Invoke-WebRequest -uri "http://ifconfig.me/ip").Content

Если вы не хотите использовать настройки прокси для всей сессии PowerShell, вы можете использовать специальные параметры командлета Invoke-WebRequest для аутентификации на прокси под текущим пользователем:

Invoke-WebRequest https://remontka.com -ProxyUseDefaultCredentials -Proxy http://192.168.0.14:3128

Либо можно запросить учетную запись интерактивно:

$ProxyCreds = Get-Credential
Invoke-WebRequest https://remontka.com -Proxy " http://192.168.0.14:3128" -ProxyCredential $ProxyCreds

Рассмотренные выше способ позволяет настроить параметры прокси сервера и выполнить аутентификацию в классическом Windows PowerShell 5.1 ( как узнать, какая версия PowerShell установлена ).

Использование прокси в PowerShell Core

В новых версиях PowerShell Core (7.x) для выполнения веб запросов в командлетах Invoke-WebRequest, Find-Module, Install-Module и т.д., вместо класса System.Net.WebRequest используется класс System.Net.HttpClient .

Соответственно, чтобы настроит параметры прокси сервера в PowerShell Core нужно использовать команду:

[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy('http://your-proxy:3128')

Для аутентификации на прокси под текущим пользователем Windows:

[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

Для интерактивного запроса имени пользователя и пароля для аутентификации на прокси:

[System.Net.Http.HttpClient]::DefaultProxy.Credentials = Get-Credential

Также PowerShell Core поддерживает специальные переменные окружения Windows, в которых можно задать параметры прокси:

  • HTTP_PROXY – прокси для HTTP запросов
  • HTTPS_PROXY — прокси для HTTPS запросов
  • ALL_PROXY – прокси и для HTTP и для HTTPS
  • NO_PROXY – список адресов исключений для прокси

Из PowerShell вы можете задать переменные окружения с помощью следующих команд:

$proxy='http://192.168.0.14:8080'

Можно сразу в переменных окружения задать имя пользователя и пароль для аутентификации на прокси-сервере:

$proxy='http://username:password@IP:PORT'

$ENV:HTTP_PROXY=$proxy
$ENV:HTTPS_PROXY=$proxy

Проверьте, что новые переменные окружения были заданы:

Dir env:

переменная окружения http_proxy для powershell core

В PowerShell Core на Linux вы можете экспортировать системные настройки прокси из переменных окружения так:

export HTTP_PROXY=http://192.168.0.14:3128
export HTTPS_PROXY=http://192.168.0.14:3128

Как автоматически применить настройки прокси с помощью профиля PowerShell?

Вы можете создать профиль PowerShell для автоматического запуска команд импорта настроек прокси при запуске PowerShell.

Для этого выполните команду, которая создаст файл профиля PowerShell C:UsersusernameDocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1 «):

notepad $PROFILE (или notepad $PROFILE.AllUsersCurrentHost – если нужно применить профиль PowerShell ко всем пользователям).

Профиль PowerShell это простой PS1 скрипт, который всегда выполняется при запуске консоли PowerShell.exe.

Скопируйте в блокнот нужный PowerShell код. Например, вы используете для настройки параметров прокси-сервера на клиенте PAC файлы (Autoconfig). Вы можете указать адрес сервера с PAC файлом и способ аутентификации на прокси-сервере под текущим пользователем:

#Использовать актуальную версию TLS 1.2 для подключения
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[system.net.webrequest]::DefaultWebProxy = new-object system.net.webproxy('http://192.168.1.90:80')
#можно заменить предыдущую строку на netsh winhttp import proxy source=ie, если нужно импортировать настройки прокси из Internet Explorer
[system.net.webrequest]::DefaultWebProxy.credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
#можно запросить учетные данные пользователя
#System.Net.WebRequest]::DefaultWebProxy.Credentials = Get-Credential
# можно загрузить пароль пользователя из XML файла (см. статью про использование сохраненных паролей в PowerShell ):
# System.Net.WebRequest]::DefaultWebProxy= Import-Clixml -Path c:pcpassword.xml
[system.net.webrequest]::DefaultWebProxy.BypassProxyOnLocal = $true

Настройки политики запуска PowerShell скриптов (PowerShell Execution Policy) по умолчанию запрещают запуск всех PS скриптов, даже из файлов профилей PowerShell. Чтобы разрешить запуск PS1 скриптов придется выполнить команду:

Set-ExecutionPolicy RemoteSigned

Сохраните файл Microsoft.PowerShell_profile.ps1 и перезапустите командную строку PowerShell. Теперь, когда вы открываете новую сессию PowerShell, выполняется код из файла профиля и в сессию импортируются настройки прокси-сервера.

Вывести настройки прокси сервера из PowerShell

Вы можете получить текущие настройки прокси-сервера в Windows из реестра командой PowerShell :

Get-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' | Select-Object ProxyServer, ProxyEnable

В моем пример адрес и порт прокси сервера: 192.168.0.14:3128

Прокси сервер включен: ProxyEnable =1

получить текущие настройки прокси из powershell

Также можно получить настройки WebProxy так:

[System.Net.WebProxy]::GetDefaultProxy()

System.Net.WebProxy]::GetDefaultProxy в powershell

Если необходимо, вы можете включить (отключить) использование прокси следующими командами (соответственно):

Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' ProxyEnable -value 1

и

Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' ProxyEnable -value 0

Как изменить настройки прокси-сервера в Windows из PowerShell?

Вы можете задать параметры прокси-сервера с помощью PowerShell. Например, следующая функция PowerShell позволяет изменить настройки прокси. Предварительно функция доступность прокси-сервер и порта на нем с помощью командлета Test-NetConnection

function Set-Proxy ( $server,$port)
{
If ((Test-NetConnection -ComputerName $server -Port $port).TcpTestSucceeded) {
Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' -name ProxyServer -Value "$($server):$($port)"
Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' -name ProxyEnable -Value 1
}
Else {
Write-Error -Message "Неверные настройки прокси-сервера:  $($server):$($port)"
}
}

Set-Proxy 192.168.0.14 3128

Добавить дополнительные адреса в список исключений прокси:

$ProxyExceptionList = ";*.remontka.com;*.yandex.ru"
$ProxyProperty = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings"
If ($ProxyProperty.ProxyOverride) {
$OldValue = $ProxyProperty.ProxyOverride
$NewValue = $OldValue+$ProxyExceptionList
$ProxyProperty | Set-ItemProperty -Name ProxyOverride -Value $NewValue
} else {
Write-Warning "Proxy overrides list empty!"
}

Дополнительно, вы можете сохранить в реестре имя и пароль пользователя для аутентификации на прокси сервере:

Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' -name ProxyUser -Value "username"
Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' -name ProxyPass -Value "password"

Обратите внимание, что в старых билдах Windows 10, Windows Server 2016 и более старых версиях Window по умолчанию для подключения используется устаревший и небезопасный протокол TLS 1.0 . Поэтому, например, при поиске модуля в PSGalery вы получите ошибку:

WARNING: Unable to resolve package source ‘https://www.powershellgallery.com/api/v2’.

Чтобы использовать TLS 1.2 для подключений к конечным точкам из PowerShell, выполните команду:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Подробнее проблема описана в статье Unable to resolve package source: ошибка установки модулей PowerShell .
EnglishRussianUkrainian