2009-02-20 33 views
31

Al hacer un simple web request, ¿hay alguna manera de decirle al entorno de PowerShell que solo use la configuración proxy de Internet Explorer?PowerShell, Solicitudes web y Proxies

Mi configuración de proxy está controlada por una política de red (o script) y no quiero tener que modificar scripts ps más adelante si no es necesario.

ACTUALIZACIÓN: Gran información de los participantes. La plantilla de guión final que voy a utilizar para esto se verá algo como lo siguiente:

$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 

Respuesta

13

No comprobado:

$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

Esto no funcionaría para mí. En lugar de leer la página web, lee el indicador del proxy para las credenciales :( – Bluz

+0

Intente configurar sus credenciales a través de $ proxy.credentials (y establezca $ proxy.useDefaultCredentials en $ false), YMMV. –

+0

Bonito, Shay, eso fue inteligente, pero desafortunadamente sigo teniendo la misma página :(Creo que usaré la vieja forma de hacerlo y copiaré el html que quiero en un archivo de texto y lo tomaré desde allí. Es un de todos modos, ¡gracias por su ayuda! – Bluz

17

Algo mejor es la siguiente, que maneja los proxys autodetectados también:

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

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

(editar) Además de lo anterior, esta definición parece funcionar bien para mí, también:

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

Cuando dice 'proxies autodetectados', ¿quiere decir scripts de configuración automática (como se llama en Internet Explorer)? – Chris

+0

Creo que sí, hace mucho tiempo Escribí eso :-)) –

+0

Tenga en cuenta que esto no parece funcionar en la PS 2.0. Creo que hay un error en cómo WebClient maneja NTLM para las versiones anteriores de .net, así que ... sí, asegúrese de tener una versión reciente de PS para hacerlo. – Nacht

7

Esto es mucho más tarde que la pregunta original, pero sigue siendo una respuesta relevante para las versiones posteriores de PowerShell. A partir de v3, tenemos dos elementos que pueden hacer frente a este:

Invoke-WebRequest - que sustituye el uso de System.Net.WebClient para casi cada escenario

$ PSDefaultParameterValues ​​ - que pueden almacenar datos para los parámetros

¿Cómo usarlos para resolver el problema original de las configuraciones proxy controladas por una política de red (o script) y no tener que modificar los scripts ps más adelante?

Invoke-WebRequest viene con los parámetros -Proxy y -ProxyUseDefaultCredentials.

Almacenamos nuestras respuestas a estos parámetros en $ PSDefaultParameterValues, así: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

Puede reemplazar 'http://###.###.###.###:80' con $ PROXYADDR como se quiere. En qué ámbito eliges almacenar esto, es tu elección. Los puse en mi perfil $, así que nunca más tengo que volver a establecer estos elementos en mis scripts.

Espero que esto ayude a alguien!

0

Simplemente actualice la URL con su propia dirección proxy: puerto. Permite a PowerShellGet ir más allá del proxy usando sus credenciales locales. Si no tiene requisitos de credenciales, simplemente haga clic en Aceptar cuando se le solicite su contraseña. Cambié el nombre de esa casilla a "Cerrar esta ventana". También puede usar otros gestores de paquetes como Chocolatey/Nuget a través del proxy debido a este script.