Pertanyaan PowerShell, Permintaan Web, dan Proxy


Saat membuat sederhana permintaan web apakah ada cara untuk memberitahu lingkungan PowerShell untuk hanya menggunakan pengaturan proxy Internet Explorer Anda?

Pengaturan proksi saya dikendalikan oleh kebijakan jaringan (atau skrip) dan saya tidak ingin memodifikasi skrip ps nanti jika saya tidak perlu.

MEMPERBARUI: Info bagus dari para peserta. Template skrip terakhir yang akan saya gunakan untuk ini akan terlihat seperti berikut:

$proxyAddr = (get-itemproperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings').ProxyServer
$proxy = new-object System.Net.WebProxy
$proxy.Address = $proxyAddr
$proxy.useDefaultCredentials = $true

$url = "http://stackoverflow.com"
$wc = new-object system.net.WebClient
$wc.proxy = $proxy
$webpage = $wc.DownloadData($url)
$str = [System.Text.Encoding]::ASCII.GetString($webpage)
Write-Host $str

32
2018-02-20 22:08


asal


Jawaban:


Belum dicoba:

$user = $env:username
$webproxy = (get-itemproperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet
Settings').ProxyServer
$pwd = Read-Host "Password?" -assecurestring

$proxy = new-object System.Net.WebProxy
$proxy.Address = $webproxy
$account = new-object System.Net.NetworkCredential($user,[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd)), "")
$proxy.credentials = $account

$url = "http://stackoverflow.com"
$wc = new-object system.net.WebClient
$wc.proxy = $proxy
$webpage = $wc.DownloadData($url)
$string = [System.Text.Encoding]::ASCII.GetString($webpage)

...


12
2018-02-20 22:37



Agak lebih baik adalah yang berikut, yang menangani proxy yang terdeteksi otomatis juga:

$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

$wc = new-object system.net.WebClient
$wc.proxy = $proxy
$webpage = $wc.DownloadData($url)

(sunting) Lebih jauh lagi, definisi ini tampaknya berfungsi dengan baik untuk saya juga:

function Get-Webclient {
    $wc = New-Object Net.WebClient
    $wc.UseDefaultCredentials = $true
    $wc.Proxy.Credentials = $wc.Credentials
    $wc
}

18
2018-02-14 14:52



$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
$proxy.useDefaultCredentials = $true
$wc = new-object system.net.webclient
$wc.proxy = $proxy
$wc.downloadString($url)

7
2018-02-21 17:20



Ini jauh lebih lambat dari pertanyaan asli, tetapi masih merupakan jawaban yang relevan untuk versi PowerShell yang lebih baru. Mulai di v3, kami memiliki dua item yang dapat mengatasi ini:

Invoke-WebRequest - yang menggantikan menggunakan system.net.webclient untuk hampir setiap skenario

$ PSDefaultParameterValues - yang dapat menyimpan detail untuk parameter

Bagaimana cara menggunakannya bersama-sama untuk memecahkan masalah asli pengaturan proxy yang dikendalikan oleh kebijakan jaringan (atau skrip) dan tidak perlu memodifikasi skrip ps nanti?

Invoke-WebRequest hadir dengan parameter -Proxy dan -ProxyUseDefaultCredentials.

Kami menyimpan jawaban kami untuk parameter ini di $ PSDefaultParameterValues, seperti: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

Anda dapat mengganti 'http: //###.###.###.###: 80'dengan $ proxyAddr seperti yang Anda inginkan. Ruang lingkup apa yang Anda pilih untuk menyimpan ini, adalah pilihan Anda. Saya memasukkannya ke profil $ saya, jadi saya tidak perlu lagi mengatur item ini di skrip saya.

Semoga ini bisa membantu seseorang!


6
2018-05-08 15:54



Cukup perbarui URL dengan alamat proxy Anda sendiri: port. Ini memungkinkan PowerShellGet melewati proxy menggunakan kredensial lokal Anda. Jika Anda tidak memiliki persyaratan kredensial, cukup klik OK ketika diminta kata sandi Anda. Saya mengganti nama kotak itu menjadi "Tutup jendela ini". Anda juga dapat menggunakan pengelola paket lain seperti Chocolatey / Nuget melalui proxy karena skrip ini.


-1
2017-07-18 06:37