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

Если ваш компьютер находится в корпоративной сети за прокси-сервером, по умолчанию вы не сможете получить доступ к внешним веб-ресурсам из 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 через аутентифицированный прокси-серверне удается подключиться к Интернету с помощью PowerShell через аутентифицированный прокси-сервер

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

Установка параметров прокси-сервера WinHTTP для PowerShell

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

netsh winhttp show proxy

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

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

netsh winhttp show proxynetsh 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 netsh winhttp set proxy

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

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

Вы можете централизованно настроить параметры прокси-сервера Winnhttp на компьютерах домена с помощью GPO.

Вы можете проверить, проходит ли соединение с определенным URL через прокси-сервер или нет: ([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("https://woshub.com")

powershell: проверить прокси-соединениеpowershell: проверка прокси-соединения

Если команда возвращает 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

powershell: получение учетных данных для аутентификации на прокси-сервере powershell: получение учетных данных для аутентификации на прокси-сервере

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

Использование PowerShell из-за аутентифицированного прокси-сервераИспользование PowerShell за аутентифицированным прокси-сервером

Или, если вы настроили прокси-соединение в сеансе PowerShell, команда должна вернуть внешний IP-адрес вашего прокси-сервера:

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

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

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

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 core set http proxypowershell core set http proxy

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

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

Для этого выполните команду, которая создаст файл профиля PowerShell (C:\Users\username\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1):

notepad $PROFILE (или notepad $PROFILE.AllUsersCurrentHost -если необходимо применить профиль PowerShell ко всем пользователям компьютера).

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

Скопируйте код 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

По умолчанию политика выполнения сценариев PowerShell не позволяет запускать сценарии PS, даже из файлов профиля PowerShell. Чтобы разрешить запуск сценариев PS1, необходимо изменить параметры политики выполнения PowerShell. Выполните команду:

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

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

Вы также можете получить настройки WebProxy следующим образом:

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

System.Net.WebProxy GetDefaultProxy powershellSystem.Net.WebProxy GetDefaultProxy powershell

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

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

Более подробно проблема описана в статье «Unable to resolve package source when installing PowerShell modules».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *