
Если ваш компьютер находится в корпоративной сети за прокси-сервером, по умолчанию вы не сможете получить доступ к внешним веб-ресурсам из PowerShell CLI. Например, вы не сможете получить содержимое внешней веб-страницы с помощью команды Invoke-WebRequest, обновить справку с помощью команды Update-Help, подключение к арендатору Azure/Microsoft 365 (модуль Exchange Online PowerShell), установка модулей из PSGallery или возможностей RSAT, загрузка пакета приложения из внешнего репозитория пакетов (с помощью менеджера пакетов WinGet). В этой статье мы покажем, как настроить PowerShell на доступ к Web через прокси-сервер с аутентификацией.
Давайте попробуем обновить справку PowerShell на компьютере, находящемся за корпоративным прокси-сервером:
Update-Help
Или обратимся к внешней веб-странице:
Invoke-WebRequest https://woshub.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. InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest).
Find-Module modulename
Unable to resolve package source 'https://www.powershellgallery.com/api/v2'
Дело в том, что Powershell (точнее, класс .NET System.Net.WebClient, который эти команды использовали для доступа к внешним ресурсам по HTTP/HTTPS) не использует параметры прокси-сервера, указанные в настройках пользователя. Давайте рассмотрим, как настроить параметры прокси-сервера и выполнить аутентификацию из консоли PowerShell.
- Установка параметров прокси-сервера WinHTTP для PowerShell
- Аутентификация через прокси-сервер с помощью PowerShell
- Настройка прокси-соединений для PowerShell Core
- Применение параметров прокси-сервера с помощью файла профиля PowerShell
- Показать текущие параметры прокси-сервера с помощью PowerShell
- Как изменить параметры прокси-сервера в Windows с помощью PowerShell?
Установка параметров прокси-сервера WinHTTP для 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-адресов или имен сайтов, для подключения к которым не нужно использовать прокси-сервер (обходной список):
netsh winhttp set proxy "192.168.1.100:3128" bypass-list= "10.*,172.*,192.168.*,*.corp.woshub.com"
Вы можете проверить, проходит ли соединение с определенным URL через прокси-сервер или нет: ([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("https://woshub.com")
Если команда возвращает False
, соединение с этим URL будет осуществляться через прокси, настроенный в сеансе PowerShell.
Если прокси-сервер требует аутентификации, будет выдана ошибка типа «(407) Требуется аутентификация прокси-сервера» будет появляться при попытке выполнить команды PowerShell. Например, при попытке подключиться к арендатору Azure с помощью модуля AzureAD:
Connect-AzureAD
Возникает ошибка:
The remote server returned an error: (407) Proxy Authentication Required.
Далее рассмотрим, как аутентифицироваться на прокси-сервере с помощью PowerShell.
Аутентификация на прокси-сервере с помощью PowerShell
Давайте рассмотрим два способа аутентификации на прокси-сервере: вы можете использовать SSO-аутентификацию Windows или указать учетные данные пользователя для аутентификации вручную.
Если вы авторизованы на своем компьютере под доменной учетной записью, а ваш прокси-сервер поддерживает 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.
$Wcl=New-Object System.Net.WebClient
$Creds=Get-Credential
$Wcl.Proxy.Credentials=$Creds
Теперь вы можете попробовать получить доступ к внешнему веб-сайту или обновить справку с помощью Update-Help
командой.
Или, если вы настроили прокси-соединение в сеансе PowerShell, команда должна вернуть внешний IP-адрес вашего прокси-сервера:
(Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
Как видите, команда Invoke-Web Request вернула данные с веб-страницы внешнего сайта!
Invoke-WebRequest https://woshub.com -ProxyUseDefaultCredentials -Proxy http://192.168.1.100:3128
Или можно запросить учетные данные пользователя в интерактивном режиме:
$ProxyCreds = Get-Credential
Invoke-WebRequest https://woshub.com -Proxy "http://192.168.1.100:3128" -ProxyCredential $ProxyCreds
Приведенный выше способ позволяет настроить параметры прокси-сервера и аутентификацию в классическом Windows PowerShell 5.1.
Настройка прокси-соединений для PowerShell Core
В новых версиях PowerShell Core (6.x, 7.x) в качестве параметра System.Net.HttpClient класс используется вместо класса System.Net.WebRequest для выполнения веб-запросов в командах Invoke-WebRequest, Find-Module, Install-Module и т. д.
Соответственно, чтобы задать настройки прокси-сервера в 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.1.100:8080'
$ENV:HTTP_PROXY=$proxy
$ENV:HTTPS_PROXY=$proxy
$proxy='http://username:password@IP:PORT'
Убедитесь, что переменные окружения прокси-сервера установлены:
Dir env:
Применение настроек прокси-сервера с помощью файла профиля PowerShell
Вы можете создать файл профиля PowerShell для автоматического импорта настроек прокси-сервера при запуске PowerShell.
Для этого выполните команду, которая создаст файл профиля PowerShell (C:\Users\username\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1):
notepad $PROFILE
(или notepad $PROFILE.AllUsersCurrentHost
-если необходимо применить профиль PowerShell ко всем пользователям компьютера).
Скопируйте код PowerShell в окно блокнота. Например, вы используете Proxy Auto-Configuration (PAC) файлы для автоматической настройки параметров прокси-сервера на компьютерах пользователей. Вы можете указать URL-адрес файла PAC и аутентифицироваться на прокси-сервере под текущим пользователем с помощью следующего сценария профиля PowerShell.
# Force PowerShell to use TLS 1.2 for connections
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[system.net.webrequest]::DefaultWebProxy = new-object system.net.webproxy('http://10.1.15.5:80')
# If you need to import proxy settings from Internet Explorer, you can replace the previous line with the: "netsh winhttp import proxy source=ie"
[system.net.webrequest]::DefaultWebProxy.credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
# You can request user credentials:
# System.Net.WebRequest]::DefaultWebProxy.Credentials = Get-Credential
# Also, you can get the user password from a saved XML file:
# System.Net.WebRequest]::DefaultWebProxy= Import-Clixml -Path C:\PS\user_creds.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.1.100: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 "Invalid proxy server address or port: $($server):$($port)"
}
}
Set-Proxy 192.168.1.100 3128
В список исключения прокси можно добавить дополнительные адреса:
$ProxyExceptionList = ";*.woshub.com;*.contoso.com"
$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 "List of proxy overrides is empty!"
}
Кроме того, вы можете сохранить логин и пароль для аутентификации на прокси-сервере в реестре:
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyUser -Value "proxy_username"
Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' -name ProxyPass -Value "proxy_password"
Обратите внимание, что старые сборки Windows 10, Windows Server 2016 и старые версии Windows по умолчанию используют устаревший и небезопасный протокол TLS 1.0 для соединений PowerShell. Поэтому при попытке поиска модуля в PSGallery вы можете получить следующую ошибку:
WARNING: Unable to resolve package source 'https://www.powershellgallery.com/api/v2'.
Чтобы использовать TLS 1.2 в соединениях PowerShell с конечными точками, выполните команду
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12