Използване на PowerShell чрез прокси сървър с удостоверяване

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

Нека се опитаме да актуализираме помощта на Powershell:

Актуализация-Помощ
Или се обърнете към външна уеб страница:

Invoke-WebRequest http://winitpro.ru

Ако няма директен достъп до Интернет, командата ще върне грешка приблизително от следния тип:

update-help: Неуспешна актуализация на помощ за модула (ите) „DhcpServer, DirectAccessClientComponents ....“ с UI култура (и) en-US: Не може да се свърже с Помощно съдържание. Сървърът, на който се съхранява Помощното съдържание, може да не е наличен. Проверете дали сървърът е наличен или изчакайте, докато сървърът се върне онлайн и след това опитайте командата отново.
Invoke-WebRequest: Не може да се свърже с отдалечения сървър

Факт е, че Powershell (или по-точно клас .NET  система.нето.WebClient, които всички командлети използват за достъп до външни ресурси чрез HTTP / HTTPS) не използва настройките на системния прокси, посочени в Interent Explorer. Класът WebClient обаче има свойства, които ви позволяват да укажете настройките на прокси сървъра (WebClient.Proxy) и данните за упълномощаване на него (WebClient.Credentials или WebClient.UseDefaultCredentials). Нека помислим как да използваме тези свойства на класа WebClient.

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

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

netsh winhttp show proxy

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

Текущи настройки за прокси сървър WinHTTP: Директен достъп (без прокси сървър).

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

netsh winhttp import proxy source = т.е.

или ги задайте ръчно:

netsh winhttp set proxy "192.168.0.14 ∗ 128"

Ако трябва да влезете в прокси сървъра, при изпълнение на заявки за PowerShell ще се появят грешки. “(407) пълномощник заверка длъжен". Например, когато се опитате да се свържете с абонамента си за Azure с командата:

Add-AzureAccount -Credential (Get-Credential)

Получавам грешката:

Add-AzureAccount: user_realm_discovery_failed: Откриването на потребителското царство не е успешно: Отдалечният сървър върна грешка: (407) Изисква се удостоверяване на прокси сървър.

Удостоверяване на прокси PowerShell

Помислете за два метода за оторизация на прокси сървър: можете да използвате SSO удостоверяване или да посочите име и потребител за автентификация ръчно.

Ако сте упълномощен в системата под акаунт в домейн и проксито ви поддържа Kerberos или NTLM Active Directory удостоверяване (ако все още не сте го деактивирали), тогава можете да използвате идентификационните данни на текущия потребител за удостоверяване на прокси сървъра (не е необходимо да въвеждате име / парола ):

$ Wcl = нов обект System.Net.WebClient
$ Wcl.Headers.Add ("потребителски агент", "PowerShell Script")
$ Wcl.Proxy.Credentials =
[System.Net.CredentialCache] :: DefaultNetworkCredentials

Ако трябва ръчно да се удостоверите с прокси сървър, изпълнете следните команди, като въведете потребителското име и парола в съответния прозорец.

$ Wcl = New-Object System.Net.WebClient
$ Creds = Получете доверие
$ Wcl.Proxy.Credentials = $ Creds

Сега можете да опитате да получите достъп до външен сайт или да актуализирате помощта с командата Update-Help.

Както можете да видите, командлетът Invoke-Web Request върна данни от страницата на външния сайт!

Задайте настройки за прокси в профил на PowerShell

Можете да създадете PowerShell профил за автоматично изпълнение на команди за импортиране на прокси при стартиране на PowerShell.

За да направите това, изпълнете командата, която ще създаде файла на профила ("C: \ Потребители \ потребителско име \ Документи \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1"):

бележник $ ПРОФИЛ (или бележник $ PROFILE.AllUsersCurrentHost - ако трябва да приложите PowerShell профил към всички потребители).

Профилът на PowerShell е скрипт, който се стартира при стартиране на PowerShell.exe..

Копирайте необходимия код на PowerShell в бележника. Например, използвате файлове (Autoconfig), за да конфигурирате прокси настройки на PAC клиента. Можете да посочите адреса на сървъра с PAC файла и метода за удостоверяване на прокси сървъра при текущия потребител:

[system.net.webrequest] :: DefaultWebProxy = new-object system.net.webproxy ('http://192.168.1.90:80')
# можете да замените предишния ред с netsh winhttp import proxy source = т.е. ако искате да импортирате настройки за прокси от 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 забранява стартирането на всички PS скриптове, дори и от профилните файлове в PowerShell. За да позволите на скриптове да се изпълняват, ще трябва да изпълните командата:

Set-ExecutionPolicy RemoteSigned

Запишете файла Microsoft.PowerShell_profile.ps1 и рестартирайте командния ред PowerShell. Уверете се, че можете да получите достъп до ресурси в Интернет от PowerShell сесия чрез прокси, без да е необходимо да стартирате допълнителни команди.

Вземете настройки за прокси сървъри от PowerShell

Можете да получите текущите настройки на прокси сървъра от системния регистър с командата PowerShell:

Get-ItemProperty -Path 'HKCU: \ Софтуер \ Microsoft \ Windows \ CurrentVersion \ Интернет настройки' | Select-Object ProxyServer, ProxyEnable

В моя пример, адресът и портът на прокси сървъра: 192.168.0.14:3128

Прокси сървърът е активиран: ProxyEnable = 1

Можете също да получите настройки на WebProxy като тази:

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

Ако е необходимо, можете да активирате (деактивирате) използването на прокси сървъри със следните команди (съответно):

Set-ItemProperty -Path 'HKCU: \ Софтуер \ Microsoft \ Windows \ CurrentVersion \ Интернет настройки' ProxyEnable-стойност 1

и

Set-ItemProperty -Path 'HKCU: \ Софтуер \ Microsoft \ Windows \ CurrentVersion \ Интернет настройки' ProxyEnable-стойност 0

Как да промените настройките на прокси сървъра чрез PowerShell?

Можете да зададете настройки за прокси, използвайки PowerShell. Например следната функция PowerShell ви позволява да промените настройките на прокси сървъра, но първо проверява наличността на прокси сървъра и порта на него с помощта на командлета Test-NetConnection

функция Set-Proxy ($ сървър, $ порт)

Ако ((Test-NetConnection -ComputerName $ сървър -Port $ порт) .TcpTestSucceeded)
Set-ItemProperty -Path 'HKCU: \ Софтуер \ Microsoft \ Windows \ CurrentVersion \ Интернет настройки' -име ProxyServer -Value "$ ($ сървър): $ ($ порт)"
Set-ItemProperty -Path 'HKCU: \ Софтуер \ Microsoft \ Windows \ CurrentVersion \ Интернет настройки' -име ProxyEnable -Value 1

Иначе
Write-Error -Message "Невалидни настройки за прокси: $ ($ сървър): $ ($ порт)"

Set-Proxy 192.168.0.14 3128