Pregunta

Al hacer una simple solicitud web ¿Hay alguna manera de indicarle al entorno PowerShell que solo use la configuración de proxy de Internet Explorer?

La configuración de mi proxy está controlada por una política de red (o secuencia de comandos) y no quiero tener que modificar las secuencias de comandos ps más adelante si no es necesario.

ACTUALIZAR:Excelente información de los participantes.La plantilla de script final que usaré para esto será similar a la 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
¿Fue útil?

Solución

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)

...

Otros consejos

Algo mejor es la siguiente, que se encarga de servidores proxy de detección automática, así:

$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
}
$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080")
$proxy.useDefaultCredentials = $true
$wc = new-object system.net.webclient
$wc.proxy = $proxy
$wc.downloadString($url)

Esto es mucho más reciente que la pregunta original, pero sigue siendo una respuesta relevante para versiones posteriores de PowerShell.A partir de la versión 3, tenemos dos elementos que pueden solucionar este problema:

Invocar-WebRequest - que reemplaza el uso de system.net.webclient para casi todos los escenarios

$PSDefaultParameterValues - que puede almacenar detalles de los parámetros

¿Cómo usarlos juntos para resolver el problema original de la configuración del proxy controlada 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)

Puedes reemplazar 'http://###.###.###.###:80' con $proxyAddr como quieras.El alcance que elija para almacenar esto es su elección.Los puse en mi perfil $, por lo que nunca más tendré que configurar estos elementos en mis scripts.

¡Espero que esto ayude a alguien!

Sólo actualizar la URL con su propia dirección de proxy: puerto. Permite PowerShellGet ir más allá del proxy utilizando sus credenciales locales. Si usted no tiene requisito de credenciales, haga clic en Aceptar cuando se le pida la contraseña. Me cambió el nombre a esa caja "Cerrar esta ventana". También puede utilizar otros gestores de paquetes como Chocolatey / Nuget a través del proxy, porque de este script.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top