Menggunakan PowerShell melalui server proxy dengan otentikasi

Jika jaringan Anda hanya dapat mengakses Internet melalui server proxy, maka Anda tidak dapat mengakses sumber daya eksternal dari sesi PowerShell: halaman web (Invoke-WebRequest cmdlet), perbarui bantuan menggunakan Update-Help, sambungkan ke Office365 / Azure atau Unduh paket dengan aplikasi dari repositori paket eksternal (menggunakan PackageManagement atau NanoServerPackage). Pada artikel ini kita akan memahami cara mengakses Internet dari sesi PowerShell melalui server proxy dengan otentikasi.

Mari kita coba memperbarui bantuan Powershell:

Perbarui-bantuan
Atau lihat halaman web eksternal:

Invoke-WebRequest http://winitpro.ru

Jika tidak ada akses langsung ke Internet, perintah tersebut akan mengembalikan kesalahan kira-kira jenis berikut:

update-help: Gagal memperbarui Bantuan untuk modul 'DhcpServer, DirectAccessClientComponents ....' dengan budaya UI en-US: Tidak dapat terhubung ke konten Bantuan. Server tempat menyimpan konten Bantuan mungkin tidak tersedia. Verifikasi bahwa server tersedia, atau tunggu hingga server kembali online, dan kemudian coba perintah lagi.
Invoke-WebRequest: Tidak dapat terhubung ke server jarak jauh

Faktanya adalah bahwa Powershell (atau lebih tepatnya kelas .NET  Sistem.Bersih.Klien web, yang digunakan semua cmdlet untuk mengakses sumber daya eksternal melalui HTTP / HTTPS) tidak menggunakan pengaturan proxy sistem yang ditentukan dalam Interent Explorer. Namun, kelas WebClient memiliki properti yang memungkinkan Anda menentukan pengaturan server proxy (WebClient.Proxy), dan data otorisasi di dalamnya (WebClient.Credentials atau WebClient.UseDefaultCredentials). Mari kita pertimbangkan bagaimana cara menggunakan properti ini dari kelas WebClient.

Pengaturan proxy untuk PowerShell dari CMD

Periksa pengaturan proxy sistem saat ini dalam sesi Powershell:

netsh winhttp tampilkan proxy

Seperti yang Anda lihat, pengaturan proxy tidak diatur..

Pengaturan proxy WinHTTP saat ini: Akses langsung (tidak ada server proxy).

Anda dapat mengimpor pengaturan proxy dari pengaturan Internet Explorer:

netsh winhttp import proxy source = ie

atau mengaturnya secara manual:

netsh winhttp set proxy "192.168.0.14 ∗ 128"

Jika Anda perlu masuk ke server proxy, kesalahan akan muncul saat menjalankan permintaan PowerShell. "(407) Proksi Otentikasi Wajib" Misalnya, ketika Anda mencoba menghubungkan ke langganan Azure Anda dengan perintah:

Tambah-AzureAkun -Kredensial (Dapatkan-Kredensial)

Saya mendapatkan kesalahan:

Add-AzureAccount: user_realm_discovery_failed: Penemuan ranah pengguna gagal: Server jarak jauh menghasilkan kesalahan: (407) Diperlukan Otentikasi Proksi.

Autentikasi Proxy PowerShell

Pertimbangkan dua metode otorisasi pada server proxy: Anda dapat menggunakan otentikasi SSO, atau tentukan nama dan pengguna untuk otentikasi secara manual.

Jika Anda diizinkan dalam sistem di bawah akun domain, dan proxy Anda mendukung Kerberos, atau otentikasi Direktori Aktif NTLM (jika Anda belum menonaktifkannya), maka Anda dapat menggunakan kredensial pengguna saat ini untuk otentikasi pada server proxy (Anda tidak perlu memasukkan nama / kata sandi ):

$ Wcl = objek-baru System.Net.WebClient
$ Wcl.Headers.Add ("agen-pengguna", "Skrip PowerShell")
$ Wcl.Proxy.Credentials =
[System.Net.CredentialCache] :: DefaultNetworkCredentials

Jika Anda perlu mengautentikasi secara manual dengan server proxy, jalankan perintah berikut dengan memasukkan nama pengguna dan kata sandi di jendela yang sesuai.

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

Sekarang Anda dapat mencoba mengakses situs eksternal atau memperbarui bantuan dengan perintah Perbarui-Bantuan.

Seperti yang Anda lihat, cmdlet Permintaan-Web Permintaan mengembalikan data dari halaman situs eksternal!

Atur pengaturan proxy di profil PowerShell

Anda dapat membuat profil PowerShell untuk secara otomatis menjalankan perintah impor impor proxy saat memulai PowerShell.

Untuk melakukan ini, jalankan perintah yang akan membuat file profil ("C: \ Users \ username \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1"):

notepad $ PROFIL (atau notepad $ PROFIL. Semua PenggunaCurrentHost - jika Anda perlu menerapkan profil PowerShell untuk semua pengguna).

Profil PowerShell adalah skrip yang berjalan saat PowerShell.exe dimulai..

Salin kode PowerShell yang diperlukan ke notepad. Misalnya, Anda menggunakan file (Autoconfig) untuk mengonfigurasi pengaturan proxy pada klien PAC. Anda dapat menentukan alamat server dengan file PAC dan metode otentikasi pada server proxy di bawah pengguna saat ini:

[system.net.webrequest] :: DefaultWebProxy = objek-baru system.net.webproxy ('http://192.168.1.90:80')
# Anda dapat mengganti baris sebelumnya dengan netsh winhttp import proxy source = ie jika Anda ingin mengimpor pengaturan proxy dari Internet Explorer
[system.net.webrequest] :: DefaultWebProxy.credentials = [System.Net.CredentialCache] :: DefaultNetworkCredentials
# dapat meminta kredensial pengguna
# System.Net.WebRequest] :: DefaultWebProxy.Credentials = Dapatkan-Credential
# Anda dapat memuat kata sandi pengguna dari file XML (lihat artikel tentang menggunakan kata sandi yang disimpan di PowerShell):
# System.Net.WebRequest] :: DefaultWebProxy = Impor-Clixml -Path c: \ pc \ password.xml
[system.net.webrequest] :: DefaultWebProxy.BypassProxyOnLocal = $ true

Kebijakan Eksekusi Skrip PowerShell Kebijakan Eksekusi PowerShell standar melarang peluncuran semua skrip PS, bahkan dari file profil PowerShell. Untuk memungkinkan skrip dijalankan, Anda harus menjalankan perintah:

Set-ExecutionPolicy RemoteSigned

Simpan file Microsoft.PowerShell_profile.ps1 dan restart prompt perintah PowerShell. Pastikan Anda dapat mengakses sumber daya di Internet dari sesi PowerShell melalui proxy tanpa perlu menjalankan perintah tambahan.

Dapatkan pengaturan proxy dari PowerShell

Anda bisa mendapatkan pengaturan proxy saat ini dari registri dengan perintah PowerShell:

Dapatkan-ItemProperty -Path 'HKCU: \ Software \ Microsoft \ Windows \ CurrentVersion \ Pengaturan Internet' | Select-Object ProxyServer, ProxyEnable

Dalam contoh saya, alamat dan port server proxy: 192.168.0.14 128

Server proxy diaktifkan: ProxyEnable = 1

Anda juga bisa mendapatkan pengaturan WebProxy seperti ini:

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

Jika perlu, Anda dapat mengaktifkan (menonaktifkan) penggunaan proxy dengan perintah berikut (masing-masing):

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

dan

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

Cara mengubah pengaturan proxy melalui PowerShell?

Anda dapat mengatur pengaturan proxy menggunakan PowerShell. Sebagai contoh, fungsi PowerShell berikut ini memungkinkan Anda untuk mengubah pengaturan proxy, tetapi terlebih dahulu memeriksa ketersediaan server proxy dan port di atasnya menggunakan cmdlet Test-NetConnection

fungsi Set-Proxy ($ server, $ port)

If ((Test-NetConnection -ComputerName $ server -Port $ port) .TcpTestSucceeded)
Set-ItemProperty -Path 'HKCU: \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings' -nama ProxyServer -Nilai "$ ($ server): $ ($ port)"
Set-ItemProperty -Path 'HKCU: \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings' -nama ProxyEnable -Nilai 1

Lain
Write-Error -Message "Pengaturan proxy tidak valid: $ ($ server): $ ($ port)"

Set-Proxy 192.168.0.14 3128