Frage

Bei der Herstellung eines einfachen Web-Anfrage Gibt es eine Möglichkeit, die PowerShell-Umgebung anzuweisen, nur die Proxy-Einstellungen Ihres Internet Explorers zu verwenden?

Meine Proxy-Einstellungen werden durch eine Netzwerkrichtlinie (oder ein Skript) gesteuert und ich möchte PS-Skripte später nicht ändern müssen, wenn ich es nicht muss.

AKTUALISIEREN:Tolle Infos von den Teilnehmern.Die endgültige Skriptvorlage, die ich dafür verwenden werde, sieht in etwa wie folgt aus:

$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
War es hilfreich?

Lösung

Ungeprüfte :

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

...

Andere Tipps

Etwas besser ist die folgende, die auch automatisch erkannt Proxys behandelt:

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

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

(edit) Ergänzend zu den oben genannten, diese Definition scheint mir gut zu funktionieren, auch:

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

Dies ist viel später als die ursprüngliche Frage, aber immer noch eine relevante Antwort für spätere Versionen von PowerShell.Ab Version 3 gibt es zwei Punkte, die dieses Problem beheben können:

Invoke-WebRequest - was die Verwendung von system.net.webclient für fast jedes Szenario ersetzt

$PSDefaultParameterValues - Hier können Details zu Parametern gespeichert werden

Wie kann man sie zusammen verwenden, um das ursprüngliche Problem der Proxy-Einstellungen zu lösen, die durch eine Netzwerkrichtlinie (oder ein Skript) gesteuert werden, ohne dass PS-Skripte später geändert werden müssen?

Invoke-WebRequest verfügt über die Parameter -Proxy und -ProxyUseDefaultCredentials.

Wir speichern unsere Antworten auf diese Parameter in $PSDefaultParameterValues, etwa so:$PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

Sie können 'ersetzen'http://###.###.###.###:80' mit $proxyAddr, wie Sie wollen.In welchem ​​Bereich Sie dies speichern möchten, bleibt Ihnen überlassen.Ich habe sie in mein $profile eingefügt, sodass ich diese Elemente nie wieder in meinen Skripten festlegen muss.

Hoffe, das hilft jemandem!

Nur aktualisieren Sie die URL mit Ihrer eigenen Proxy-Adresse: Port. Es ermöglicht PowerShellGet vorbei an den Proxy zu gehen, um Ihre lokalen Anmeldeinformationen. Wenn Sie nicht Credential Anforderung haben, einfach auf OK klicken, wenn nach Ihrem Passwort gefragt. Ich umbenannt, dass das Feld auf „Fenster schließen“. Sie können auch andere Paketmanager wie Chocolatey / Nuget über den Proxy verwenden, da dieses Skript.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top