Использование PowerShell через прокси сервер с аутентификацией

Если в вашей сети доступ в Интернет возможен только через прокси-сервер, то вы не сможете обратиться из сессии PowerShell к внешним ресурсам: веб-странице (командлет Invoke-WebRequest), обновить справку с помощью Update-Help, подключиться к Office365/Azure или загрузить пакет с приложением из внешнего репозитория пакетов (с помощью PackageManagement или NanoServerPackage). В этой статье мы разберемся как из сессии PowerShell получить доступ в Интернет через прокси-сервер с аутентификацией.

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

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

Invoke-WebRequest http://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

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

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

Настройки прокси для PowerShell из CMD

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

netsh winhttp show proxy

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

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

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

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

netsh winhttp import proxy source=ie

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

netsh winhttp set proxy "192.168.0.14:3128"

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

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

Add-AzureAccount -Credential (Get-Credential)

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

Add-AzureAccount : user_realm_discovery_failed: User realm discovery failed: The remote server returned an error: (407) Proxy Authentication Required.

Аутентификация на прокси из 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

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

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

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

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

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

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

Задать параметры прокси в профиле PowerShell

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

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

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

Профиль PowerShell – это скрипт, который запускается при запуске PowerShell.exe.

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

[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

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

Set-ExecutionPolicy RemoteSigned

Сохраните файл Microsoft.PowerShell_profile.ps1 и перезапустите командную строку PowerShell. Убедитесь, что вы можете из сессии PowerShell обращаться к ресурсам в Интернет через прокси без необходимости запуска дополнительных команд.

Получить настройки прокси сервера из PowerShell

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

Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet 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:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable -value 1

и

Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' ProxyEnable -value 0

Как изменить настройки прокси-сервера через 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


Предыдущая статья Следующая статья


Комментариев: 4 Оставить комментарий

Оставить комментарий

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

Я не робот( Обязательно отметьте)