web-dev-qa-db-fra.com

PowerShell, requêtes Web et proxys

Lors d'une simple demande Web existe-t-il un moyen de dire à l'environnement PowerShell d'utiliser simplement les paramètres de proxy de votre Internet Explorer?

Mes paramètres de proxy sont contrôlés par une stratégie réseau (ou script) et je ne veux pas avoir à modifier les scripts ps plus tard si je ne le dois pas.

MISE À JOUR: Excellentes informations des participants. Le modèle de script final que j'utiliserai pour cela ressemblera à ceci:

$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
34
BuddyJoe

non testé:

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

...

13
Mitch Wheat

Un peu mieux est le suivant, qui gère également les proxys détectés automatiquement:

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

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

(modifier) ​​En plus de ce qui précède, cette définition semble bien fonctionner pour moi aussi:

function Get-Webclient {
    $wc = New-Object Net.WebClient
    $wc.UseDefaultCredentials = $true
    $wc.Proxy.Credentials = $wc.Credentials
    $wc
}
22
Paul Moore
$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
$proxy.useDefaultCredentials = $true
$wc = new-object system.net.webclient
$wc.proxy = $proxy
$wc.downloadString($url)
9
Shay Levy

C'est beaucoup plus tard que la question d'origine, mais c'est toujours une réponse pertinente pour les versions ultérieures de PowerShell. À partir de la v3, nous avons deux éléments qui peuvent résoudre ce problème:

Invoke-WebRequest - qui remplace l'utilisation de system.net.webclient pour presque tous les scénarios

$ PSDefaultParameterValues ​​ - qui peut stocker les détails des paramètres

Comment les utiliser ensemble pour résoudre le problème d'origine des paramètres de proxy contrôlés par une stratégie réseau (ou script) et ne pas avoir à modifier les scripts ps plus tard?

Invoke-WebRequest est fourni avec les paramètres -Proxy et -ProxyUseDefaultCredentials.

Nous stockons nos réponses à ces paramètres dans $ PSDefaultParameterValues, comme ceci: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80')$PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

Vous pouvez remplacer ' http: //###.###.###.###: 8 ' par $ proxyAddr comme vous voulez. Dans quelle étendue vous choisissez de stocker cela, c'est votre choix. Je les ai mis dans mon profil $, donc je n'ai plus jamais à replacer ces éléments dans mes scripts.

J'espère que cela aide quelqu'un!

7
Bewc