Если ваш компьютер находится в сети за прокси сервером, вы получите ряд проблема при доступе из сессии PowerShell к внешним ресурсам. Например, вы не сможете получить содержимое внешней веб-страницы с помощью командлета Invoke-WebRequest, обновить справку с помощью Update-Help, подключиться к тенанту Azure/Microsoft 365 (модуль Exchange Online PowerShell), установить модули из PSGallery, или компоненты RSAT, или загрузить пакет с приложением из внешнего репозитория пакетов (с помощью PackageManagement или winget). В этой статье мы разберемся, как из настроить PowerShell для доступа в Интернет через прокси-сервер с аутентификацией.
Попробуйте обновить справку Powershell:
Update-Help
Или обратиться к внешней веб-странице:
Invoke-WebRequest https://winitpro.ru
При отсутствии прямого выхода в Интернет команда вернет такую ошибку:
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 (а точнее класс .NET System.Net.WebClient, который используют все командлеты при обращении к внешним ресурсам по HTTP/HTTPS) не использует настройки прокси-сервера, заданные в параметрах пользователя. Рассмотрим, как настроить задать параметры прокси сервера и выполнить аутентификацию из консоли PoweShell.
- Настройка параметров подключения к прокси-серверу в PowerShell
- Аутентификация на прокси сервере из PowerShell
- Использование прокси в PowerShell Core
- Как автоматически применить настройки прокси с помощью профиля PowerShell?
- Вывести настройки прокси сервера из PowerShell
- Как изменить настройки прокси-сервера в Windows из PowerShell?
Настройка параметров подключения к прокси-серверу в PowerShell
Проверьте текущие настройки системного прокси в сессии Powershell:
netsh winhttp show proxy
Как вы видите, настройки прокси не заданы.
Current WinHTTP proxy settings: Direct access (no proxy server).
Можно импортировать настройки прокси-сервера из настроек Windows (Internet Explorer):
netsh winhttp import proxy source=ie
или задать их вручную:
netsh winhttp set proxy "192.168.0.14:3128"
Вы можете задать список IP адресов или имен сайтов, для подключения к которым не нужно использовать прокси-сервер (bypass list):
netsh winhttp set proxy "192.168.0.14:3128" bypass-list= "10.*,172.*,192.168.*,*.corp.winitpro.ru"
Вы можете проверить, выполняется ли подключение к определённому URL адресу через прокси или нет. Выполните команду:
([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("https://winitpro.ru")
Если команда вернула
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
Теперь можно попробовать обратится к внешнему сайту или обновить справку командой Update-Help.
Как вы видите, командлет Invoke-Web Request вернул данные со страницы внешнего сайта!
С помощью PowerShell вы можете проверить свой внешний IP адрес, под которым вы выходите в интернет. Если вы настроили подключение через прокси, команда должна вернуть внешний IP адрес вашего прокси сервера:
(Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
Invoke-WebRequest https://winitpro.ru -ProxyUseDefaultCredentials -Proxy http://192.168.0.14:3128
Либо можно запросить учетную запись интерактивно:
$ProxyCreds = Get-Credential
Invoke-WebRequest https://winitpro.ru -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:
В 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:\Users\username\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
«):
notepad $PROFILE
(или
notepad $PROFILE.AllUsersCurrentHost
– если нужно применить профиль PowerShell ко всем пользователям).
Скопируйте в блокнот нужный 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:\pc\password.xml
[system.net.webrequest]::DefaultWebProxy.BypassProxyOnLocal = $true
Set-ExecutionPolicy RemoteSigned
Сохраните файл Microsoft.PowerShell_profile.ps1 и перезапустите командную строку PowerShell. Теперь, когда вы открываете новую сессию PowerShell, выполняется код из файла профиля и в сессию импортируются настройки прокси-сервера.
Вывести настройки прокси сервера из PowerShell
Вы можете получить текущие настройки прокси-сервера в Windows из реестра командой PowerShell:
Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyServer, ProxyEnable
В моем пример адрес и порт прокси сервера:
192.168.0.14:3128
Прокси сервер включен:
ProxyEnable =1
Также можно получить настройки WebProxy так:
[System.Net.WebProxy]::GetDefaultProxy()
Если необходимо, вы можете включить (отключить) использование прокси следующими командами (соответственно):
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable -value 1
и
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet 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:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyServer -Value "$($server):$($port)"
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyEnable -Value 1
}
Else {
Write-Error -Message "Неверные настройки прокси-сервера: $($server):$($port)"
}
}
Set-Proxy 192.168.0.14 3128
Добавить дополнительные адреса в список исключений прокси:
$ProxyExceptionList = ";*.winitpro.ru;*.yandex.ru"
$ProxyProperty = Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet 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:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyUser -Value "username"
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet 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