Korzystanie z PowerShell przez serwer proxy z uwierzytelnianiem

Jeśli Twoja sieć może uzyskać dostęp do Internetu tylko za pośrednictwem serwera proxy, to nie możesz uzyskać dostępu do zasobów zewnętrznych z sesji PowerShell: strony internetowej (cmdlet Invoke-WebRequest), zaktualizuj pomoc za pomocą pomocy aktualizacji, połącz się z Office365 / Azure lub Pobierz pakiet z aplikacją z zewnętrznego repozytorium pakietów (używając PackageManagement lub NanoServerPackage). W tym artykule zrozumiemy, jak uzyskać dostęp do Internetu z sesji PowerShell za pośrednictwem serwera proxy z uwierzytelnianiem.

Spróbujmy zaktualizować pomoc PowerShell:

Aktualizacja pomocy
Lub zapoznaj się z zewnętrzną stroną internetową:

Invoke-WebRequest http://winitpro.ru

Jeśli nie ma bezpośredniego dostępu do Internetu, polecenie zwróci błąd następującego typu:

update-help: Nieudana aktualizacja Pomocy dla modułów „DhcpServer, DirectAccessClientComponents ....” z kulturami interfejsu użytkownika en-US: Nie można połączyć się z treścią Pomocy. Serwer, na którym przechowywana jest zawartość Pomocy, może być niedostępny. Sprawdź, czy serwer jest dostępny, lub poczekaj, aż serwer powróci do trybu online, a następnie spróbuj ponownie wykonać polecenie.
Invoke-WebRequest: Nie można połączyć się ze zdalnym serwerem

Faktem jest, że Powershell (a raczej klasa .NET  System.Netto.Webclient, których wszystkie polecenia cmdlet używają do uzyskania dostępu do zasobów zewnętrznych za pośrednictwem protokołu HTTP / HTTPS) nie korzystają z systemowych ustawień proxy określonych w Eksploratorze Interent. Jednak klasa WebClient ma właściwości, które pozwalają określić ustawienia serwera proxy (WebClient.Proxy) i dane autoryzacyjne na nim (WebClient.Credentials lub WebClient UseDefaultCredentials). Zastanówmy się, jak korzystać z tych właściwości klasy WebClient.

Ustawienia proxy dla PowerShell z CMD

Sprawdź bieżące ustawienia proxy systemu w sesji PowerShell:

netsh winhttp pokaż proxy

Jak widać, ustawienia proxy nie są ustawione..

Bieżące ustawienia proxy WinHTTP: bezpośredni dostęp (bez serwera proxy).

Możesz zaimportować ustawienia proxy z ustawień Internet Explorera:

netsh winhttp import proxy proxy source = ie

lub ustaw je ręcznie:

netsh winhttp ustaw proxy „192.168.0.14 ∗ 128”

Jeśli musisz zalogować się do serwera proxy, podczas wykonywania żądań PowerShell pojawią się błędy. ”(407) Pełnomocnik Uwierzytelnianie Wymagane„ Na przykład podczas próby połączenia się z subskrypcją platformy Azure za pomocą polecenia:

Dodaj AzureAccount -Credential (Get-Credential)

Dostaję błąd:

Add-AzureAccount: user_realm_discovery_failed: Wykrywanie dziedziny użytkownika nie powiodło się: Serwer zdalny zwrócił błąd: (407) Wymagane uwierzytelnienie serwera proxy.

Uwierzytelnianie serwera proxy PowerShell

Rozważ dwie metody autoryzacji na serwerze proxy: możesz użyć uwierzytelniania SSO lub ręcznie podać nazwę i użytkownika dla uwierzytelnienia.

Jeśli masz uprawnienia w systemie do konta domeny, a Twój serwer proxy obsługuje uwierzytelnianie Kerberos lub NTLM Active Directory (jeśli jeszcze go nie wyłączyłeś), możesz użyć poświadczeń bieżącego użytkownika do uwierzytelnienia na serwerze proxy (nie musisz wprowadzać nazwy / hasła ):

$ Wcl = nowy obiekt System.Net.WebClient
$ Wcl.Headers.Add („user-agent”, „PowerShell Script”)
$ Wcl.Proxy.Credentials =
[System.Net.CredentialCache] :: DefaultNetworkCredentials

Jeśli musisz ręcznie uwierzytelnić się na serwerze proxy, uruchom następujące polecenia, wprowadzając nazwę użytkownika i hasło w odpowiednim oknie.

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

Teraz możesz spróbować uzyskać dostęp do strony zewnętrznej lub zaktualizować pomoc za pomocą polecenia Update-Help.

Jak widać, polecenie cmdlet Invoke-Web Request zwróciło dane ze strony witryny zewnętrznej!

Ustaw ustawienia proxy w profilu PowerShell

Możesz utworzyć profil PowerShell, aby automatycznie uruchamiać polecenia importu proxy importu podczas uruchamiania PowerShell.

Aby to zrobić, uruchom polecenie, które utworzy plik profilu („C: \ Users \ nazwa użytkownika \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1„):

notatnik $ PROFIL (lub notatnik $ PROFILE.AllUsersCurrentHost - jeśli chcesz zastosować profil PowerShell do wszystkich użytkowników).

Profil programu PowerShell to skrypt uruchamiany podczas uruchamiania programu PowerShell.exe..

Skopiuj wymagany kod PowerShell do notatnika. Na przykład używasz plików (Autoconfig) do konfigurowania ustawień proxy na kliencie PAC. Możesz podać adres serwera za pomocą pliku PAC i metodę uwierzytelnienia na serwerze proxy dla bieżącego użytkownika:

[system.net.webrequest] :: DefaultWebProxy = nowy obiekt system.net.webproxy („http://192.168.1.90:80”)
# możesz zastąpić poprzednią linię netsh winhttp import proxy proxy source = tzn. jeśli chcesz importować ustawienia proxy z Internet Explorera
[system.net.webrequest] :: DefaultWebProxy.credentials = [System.Net.CredentialCache] :: DefaultNetworkCredentials
# może zażądać poświadczeń użytkownika
# System.Net.WebRequest] :: DefaultWebProxy.Credentials = Get-Credential
# możesz załadować hasło użytkownika z pliku XML (zobacz artykuł na temat używania zapisanych haseł w PowerShell):
# System.Net.WebRequest] :: DefaultWebProxy = Importuj-Clixml -Path c: \ pc \ password.xml
[system.net.webrequest] :: DefaultWebProxy.BypassProxyOnLocal = $ true

Zasady wykonywania skryptów PowerShell Domyślne zasady wykonywania skryptów PowerShell zabraniają uruchamiania wszystkich skryptów PS, nawet z plików profili PowerShell. Aby umożliwić uruchamianie skryptów, musisz uruchomić polecenie:

Set-ExecutionPolicy RemoteSigned

Zapisz plik Microsoft.PowerShell_profile.ps1 i uruchom ponownie wiersz polecenia PowerShell. Upewnij się, że możesz uzyskać dostęp do zasobów w Internecie z sesji PowerShell za pośrednictwem serwera proxy bez konieczności uruchamiania dodatkowych poleceń.

Uzyskaj ustawienia proxy z PowerShell

Możesz uzyskać bieżące ustawienia proxy z rejestru za pomocą polecenia PowerShell:

Get-ItemProperty -Path „HKCU: \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings” | Wybierz obiekt ProxyServer, ProxyEnable

W moim przykładzie adres i port serwera proxy: 192.168.0.14 128

Serwer proxy jest włączony: ProxyEnable = 1

Możesz także uzyskać takie ustawienia WebProxy:

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

W razie potrzeby można włączyć (wyłączyć) korzystanie z serwerów proxy za pomocą następujących poleceń (odpowiednio):

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

i

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

Jak zmienić ustawienia proxy za pomocą PowerShell?

Możesz ustawić ustawienia proxy za pomocą PowerShell. Na przykład poniższa funkcja PowerShell umożliwia zmianę ustawień proxy, ale najpierw sprawdza dostępność serwera proxy i portu na nim za pomocą polecenia cmdlet Test-NetConnection

funkcja Set-Proxy ($ serwer, $ port)

Jeśli ((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

W przeciwnym razie
Błąd zapisu-komunikat „Nieprawidłowe ustawienia proxy: $ ($ serwer): $ ($ port)”

Serwer proxy 192.168.0.14 3128