Використання 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 (а точніше клас .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).

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

netsh winhttp import proxy source = ie

або задати їх вручну:

netsh winhttp set proxy "192.168.0.14:3128"

Якщо на проксі-сервері потрібно авторизуватися, при виконанні запитів 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

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

Як ви бачите, командлет 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. Щоб дозволити запуск скриптів доведеться виконати команду:

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

Також можна отримати настройки 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

Як змінити налаштування проксі-сервера через 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