Когда компьютер находится за прокси-сервером, доступ к внешним ресурсам из PowerShell может быть ограничен. Это затрагивает такие операции, как загрузка веб-страниц через Invoke-WebRequest, обновление справки (Update-Help), установка модулей из PSGallery, подключение к Azure или Microsoft 365, а также загрузка пакетов через winget или PackageManagement. В этой статье мы разберём, как настроить PowerShell для работы через прокси-сервер с аутентификацией, используя команды, профили и переменные окружения.
Проблемы доступа через прокси в PowerShell
При попытке выполнить команды, требующие доступа в интернет, без настроенного прокси, вы получите ошибки. Например:
— Обновление справки:
Update-Help
Ошибка: Failed to update Help… Unable to connect to Help content.
— Доступ к веб-странице:
Invoke-WebRequest https://softcomputers.market
Ошибка: Unable to connect to the remote server.
— Поиск модуля в PSGallery:
Find-Module modulename
Ошибка: Unable to resolve package source ‘https://www.powershellgallery.com/api/v2’.
Причина в том, что PowerShell (использующий класс System.Net.WebClient в Windows PowerShell 5.1 или System.Net.HttpClient в PowerShell Core 7.x) не применяет системные настройки прокси, заданные в настройках Windows.
Настройка прокси-сервера в PowerShell
Проверка текущих настроек прокси
1. Проверка системных настроек прокси
Выведите текущие параметры WinHTTP:
netsh winhttp show proxy
Если прокси не настроен, вывод будет: Direct access (no proxy server).
2. Импорт настроек из Internet Explorer
Импортируйте настройки прокси из браузера:
netsh winhttp import proxy source=ie
3. Ручная настройка прокси
Задайте адрес и порт прокси-сервера вручную:
netsh winhttp set proxy "192.168.0.14:3128"
4. Настройка списка исключений
Укажите адреса, для которых прокси не используется:
netsh winhttp set proxy "192.168.0.14:3128" bypass-list="10.*,172.*,192.168.*,*.corp.softcomputers.org"
5. Проверка обхода прокси
Убедитесь, использует ли PowerShell прокси для конкретного URL:
([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("https://softcomputers.market")
Результат $False означает, что подключение идёт через прокси.
Аутентификация на прокси-сервере
Если прокси требует аутентификацию, без неё возникнет ошибка (407) Proxy Authentication Required. Рассмотрим два подхода: использование текущих учётных данных и ручной ввод.
1. Аутентификация с текущими учётными данными
Для доменной сети с поддержкой Kerberos или NTLM используйте учётные данные текущего пользователя:
$Wcl = New-Object System.Net.WebClient
$Wcl.Headers.Add("user-agent", "PowerShell Script")
$Wcl.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
2. Ручная аутентификация
Запросите учётные данные вручную:
$Wcl = New-Object System.Net.WebClient
$Creds = Get-Credential
$Wcl.Proxy.Credentials = $Creds
После этого команды, такие как Invoke-WebRequest или Update-Help, должны работать корректно.
3. Проверка внешнего IP
Убедитесь, что вы используете прокси, проверив внешний IP:
(Invoke-WebRequest -Uri "http://ifconfig.me/ip").Content
IP должен соответствовать адресу прокси-сервера.
4. Однократное использование прокси
Для разового запроса укажите прокси в командлете:
Invoke-WebRequest https://softcomputers.market -ProxyUseDefaultCredentials -Proxy "http://192.168.0.14:3128"
Или с ручной аутентификацией:
$ProxyCreds = Get-Credential
Invoke-WebRequest https://softcomputers.market -Proxy "http://192.168.0.14:3128" -ProxyCredential $ProxyCreds
Настройка прокси в PowerShell Core (7.x)
В PowerShell Core для веб-запросов используется класс System.Net.HttpClient, что требует немного иных настроек.
1. Задание прокси
Укажите адрес прокси-сервера:
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy('http://192.168.0.14:3128')
2. Аутентификация текущим пользователем
Используйте текущие учётные данные:
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
3. Ручная аутентификация
Запросите учётные данные:
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = Get-Credential
4. Использование переменных окружения
Задайте прокси через переменные окружения:
$proxy = 'http://192.168.0.14:3128'
$ENV:HTTP_PROXY = $proxy
$ENV:HTTPS_PROXY = $proxy
Для аутентификации включите учётные данные в URL:
$proxy = 'http://username:password@192.168.0.14:3128'
Проверьте переменные:
Get-ChildItem Env:
На Linux экспортируйте переменные:
export HTTP_PROXY=http://192.168.0.14:3128
export HTTPS_PROXY=http://192.168.0.14:3128
Автоматизация настроек через профиль PowerShell
Для автоматической настройки прокси при запуске PowerShell создайте профиль:
1. Создание профиля
Откройте файл профиля:
notepad $PROFILE
Или для всех пользователей:
notepad $PROFILE.AllUsersCurrentHost
2. Добавление настроек прокси
Добавьте код, например, для использования PAC-файла и аутентификации:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy('http://192.168.1.90:80')
[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
[System.Net.WebRequest]::DefaultWebProxy.BypassProxyOnLocal = $true
3. Разрешение выполнения скриптов
По умолчанию скрипты запрещены. Разрешите их:
Set-ExecutionPolicy RemoteSigned
4. Проверка профиля
Перезапустите PowerShell. Настройки прокси будут применены автоматически.
Управление настройками прокси через реестр
1. Просмотр настроек прокси
Получите текущие параметры из реестра:
Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' | Select-Object ProxyServer, ProxyEnable
Также можно получить настройки WebProxy таким способом:
[System.Net.WebProxy]::GetDefaultProxy()
2. Включение/отключение прокси
Включите прокси:
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
3. Изменение настроек прокси
Используйте функцию для изменения прокси с проверкой доступности:
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
4. Добавление исключений
Добавьте адреса в список исключений:
$ProxyExceptionList = ";*.softcomputers.org;*.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 "Список исключений пуст!" }
5. Сохранение учётных данных
Сохраните имя и пароль для аутентификации:
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"
Использование TLS 1.2
В старых версиях Windows (Windows 10, Server 2016) используется устаревший TLS 1.0, что может вызывать ошибки при доступе к PSGallery. Включите TLS 1.2:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Рекомендации
— Храните пароли в безопасном формате (например, через Export-Clixml) вместо реестра.
— Проверяйте поддержку Kerberos/NTLM на прокси-сервере для упрощения аутентификации.
— Используйте PAC-файлы для автоматической настройки прокси в корпоративных сетях.
— Настройте профиль PowerShell для автоматизации, но убедитесь, что политика выполнения скриптов (ExecutionPolicy) позволяет запуск.
— Тестируйте настройки с помощью Invoke-WebRequest или Test-NetConnection перед использованием критических команд.
Эти методы позволяют настроить PowerShell для работы через прокси-сервер в Windows PowerShell 5.1 и PowerShell Core 7.x, обеспечивая доступ к внешним ресурсам, таким как PSGallery, Azure и веб-сайты.