2009-02-20 34 views
31

Quando si crea un semplice web request esiste un modo per comunicare all'ambiente PowerShell di utilizzare semplicemente le impostazioni proxy di Internet Explorer?PowerShell, Richieste Web e Proxy

Le mie impostazioni proxy sono controllate da un criterio di rete (o da uno script) e non desidero modificare gli script ps in un secondo momento se non è necessario.

AGGIORNAMENTO: Grandi informazioni dai partecipanti. Il modello di script finale che userò per questo avrà un aspetto simile al seguente:

$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 

risposta

13

testato:

$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) 

...

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

Questo non funzionerebbe per me. Invece di leggere la pagina web, legge il prompt del proxy per le credenziali :( – Bluz

+0

Prova a impostare le tue credenziali tramite $ proxy.credentials (e imposta $ proxy.useDefaultCredentials su $ false), YMMV. –

+0

Bello uno Shay, che è stato intelligente ma sfortunatamente ho ancora la stessa pagina :(Penso che userò il vecchio modo di farlo e copia incolla l'html che voglio in un file di testo e lo prendo da lì. È un uno script off comunque Grazie per il tuo aiuto! – Bluz

17

Un po 'meglio è la seguente, che gestisce anche i proxy rilevati automaticamente:

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

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

(modifica) A seguito di quanto sopra, questa definizione sembra funzionare bene anche per me:

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

Quando dici "proxy auto-rilevati", intendi script di configurazione automatici (come l'opzione è chiamata in Internet Explorer)? – Chris

+0

Penso di sì, sì (è molto tempo che non L'ho scritto :-)) –

+0

Nota che questo non sembra funzionare su PS 2.0. Penso che ci sia un bug nel modo in cui NTLM viene gestito da WebClient per versioni .net precedenti quindi ... sì assicurati di avere una versione recente di PS per farlo. – Nacht

7

Questo è molto più tardi rispetto alla domanda iniziale, ma pur sempre una risposta rilevante per le versioni successive di PowerShell. A partire dal v3, abbiamo due elementi in grado di affrontare questo:

Invoke-WebRequest - che sostituisce usando System.Net.WebClient per quasi tutti gli scenari

$ PSDefaultParameterValues ​​ - in grado di memorizzare i dettagli per i parametri

Come usarli insieme per risolvere il problema originale delle impostazioni proxy controllate da un criterio di rete (o script) e non dover modificare gli script ps in seguito?

Invoke-WebRequest viene fornito con parametri -Proxy e -ProxyUseDefaultCredentials.

archiviamo le nostre risposte a questi parametri nel $ PSDefaultParameterValues, in questo modo: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

È possibile sostituire 'http://###.###.###.###:80' con $ proxyAddr come vuoi tu. Qual è l'ambito in cui scegli di archiviarlo, è la tua scelta. Li ho inseriti nel mio profilo $, quindi non ho mai dovuto reimpostare questi elementi nei miei script.

Spero che questo aiuti qualcuno!

0

Basta aggiornare l'URL con il proprio indirizzo proxy: porta. Consente a PowerShellGet di superare il proxy utilizzando le credenziali locali. Se non si dispone di requisiti di credenziali, è sufficiente fare clic su OK quando viene richiesta la password. Ho rinominato quella casella in "Chiudi questa finestra". È inoltre possibile utilizzare altri gestori di pacchetti come Chocolatey/Nuget tramite il proxy a causa di questo script.

Problemi correlati