Usar PowerShell detrás de un servidor proxy

Si puede acceder a Internet desde su computadora solo a través de un servidor proxy, entonces de manera predeterminada no podrá acceder a recursos web externos desde su sesión de PowerShell: una página web (cmdlet Invoke-WebRequest), actualice la ayuda usando el Actualización-Ayuda cmdlet, conéctese a Office365 / Azure, o descargar una aplicación paquete desde un repositorio de paquetes externo (usando PackageManagement o NanoServerPackage). En este artículo, le mostraremos cómo acceder a la web desde una sesión de PowerShell a través de un servidor proxy con autenticación.

Intentemos actualizar la Ayuda de PowerShell desde una computadora detrás de un servidor proxy:

Update-Help

O acceda a una página web externa:

Invoke-WebRequest http://woshub.com
Si no tiene una conexión directa a Internet, el comando devolverá un error similar:

Update-help : Failed to update Help for the module(s) ‘DhcpServer, DirectAccessClientComponents….’  with UI culture(s) {en-US} : Unable to connect to Help content. The server on which Help content is stored might not be available. Verify that the server is available, or wait until the server is back online, and then try the command again.
Invoke-WebRequest: Unable to connect to the remote server.

InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest).

no se puede conectar a Internet desde PowerShell a través del servidor proxy autenticadoEl asunto es que PowerShell (o más bien, la clase .NET System.Net.WebClient, que estos cmdlets usaron para acceder a recursos externos a través de HTTP / HTTPS) no usa la configuración de proxy especificada en Internet Explorer. Sin embargo, la clase WebClient tiene algunas propiedades que le permiten especificar ambas configuraciones de proxy (WebClient.Proxy) y datos de autenticación de proxy (WebClient.Credentials o WebClient.UseDefaultCredentials). Consideremos cómo usar estas propiedades de la clase WebClient.

Administrar la configuración del servidor proxy WinHTTP para PowerShell

Comprobemos la configuración actual del proxy del sistema de PowerShell:

netsh winhttp show proxy

Como puede ver, la configuración del proxy no está especificada:

Current WinHTTP proxy settings:
Direct access (no proxy server).

netsh winhttp show proxy

Puede importar la configuración del servidor proxy desde los parámetros de Internet Explorer:

netsh winhttp import proxy source=ie

o configúrelos manualmente:

netsh winhttp set proxy "192.168.0.14:3128"

netsh winhttp establecer proxy

Si la autenticación de proxy es necesaria, el error como «(407) Se requiere autenticación de proxy”Aparecerá cuando intente ejecutar comandos de PowerShell. Por ejemplo, cuando intenta conectarse a su suscripción de Azure con el comando:

Add-AzureAccount -Credential (Get-Credential)

Ocurre un error:

Add-AzureAccount : user_realm_discovery_failed: User realm discovery failed: The remote server returned an error: (407) Proxy Authentication Required.

¿Cómo configurar la autenticación de proxy con PowerShell?

Consideremos dos formas de usar la autenticación de proxy: puede usar la autenticación SSO de Active Directory o especificar las credenciales de usuario para la autenticación manualmente.

Si está autorizado en su computadora con una cuenta de dominio y su servidor proxy es compatible con Active Directory Kerberos o autenticación NTLM (si aún no lo ha desactivado), puede usar las credenciales de usuario actuales para autenticarse en el servidor proxy (usted no es necesario que ingrese su nombre de usuario y contraseña):

$Wcl = new-object System.Net.WebClient
$Wcl.Headers.Add(“user-agent”, “PowerShell Script”)
$Wcl.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

Si necesita autenticarse en el servidor proxy manualmente, ejecute los siguientes comandos y especifique el nombre de usuario y la contraseña en la ventana de credenciales correspondiente.

$Wcl=New-Object System.Net.WebClient
$Creds=Get-Credential
$Wcl.Proxy.Credentials=$Creds

powershell: obtenga credenciales para autenticarse en un servidor proxy

Ahora puede intentar acceder a un sitio web externo o actualizar la ayuda usando el comando Actualizar-Ayuda.

Usar PowerShell desde detrás del proxy autenticado

Como puede ver, el cmdlet Invoke-Web Request devolvió datos de la página web del sitio externo.

Establecer la configuración del servidor proxy en el archivo de perfil de PowerShell

Puede crear un archivo de perfil de PowerShell para establecer automáticamente la configuración del proxy cuando se inicia PowerShell.

Para hacer esto, ejecute el comando que creará el archivo de perfil de PowerShell (C: Usuarios nombre de usuario Documentos WindowsPowerShell Microsoft.PowerShell_profile.ps1):

notepad $PROFILE (o notepad $PROFILE.AllUsersCurrentHost – si necesita aplicar un perfil de PowerShell a todos los usuarios de la computadora).

Un perfil de PowerShell es un script de PS que se ejecuta cuando se inicia el proceso de PowerShell.exe.

Copie su código de PowerShell en la ventana del bloc de notas. Por ejemplo, está utilizando el Configuración automática de proxy (PAC) archivos para configurar automáticamente la configuración del servidor proxy en las computadoras de los usuarios. Puede especificar la dirección URL del archivo PAC y autenticarse en el servidor proxy con el usuario actual con el siguiente script de perfil de PowerShell.

[system.net.webrequest]::DefaultWebProxy = new-object system.net.webproxy('http://10.1.15.5:80')
# If you need to import proxy settings from Internet Explorer, you can replace the previous line with the: "netsh winhttp import proxy source=ie"
[system.net.webrequest]::DefaultWebProxy.credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
# You can request user credentials:
# System.Net.WebRequest]::DefaultWebProxy.Credentials = Get-Credential
# Also, you can get the user password from a saved XML file (see the article “Using saved credentials in PowerShell scripts”):
# System.Net.WebRequest]::DefaultWebProxy= Import-Clixml -Path C:PSuser_creds.xml
[system.net.webrequest]::DefaultWebProxy.BypassProxyOnLocal = $true

De forma predeterminada, la Política de ejecución de scripts de PowerShell no permite que se ejecuten todos los scripts de PS, incluso desde archivos de perfil de PowerShell. Para permitir que se ejecuten los scripts, debe cambiar su Política de ejecución de PowerShell. Ejecute el comando:

Set-ExecutionPolicy RemoteSigned

Salva el Microsoft.PowerShell_profile.ps1 y reinicie la ventana de la consola de PowerShell. Asegúrese de que ahora puede acceder a los recursos web desde una sesión de PowerShell a través de un proxy sin la necesidad de ejecutar comandos adicionales.

Verifique la configuración actual del servidor proxy desde PowerShell

Puede obtener la configuración de proxy actual del registro con el comando de PowerShell:

Get-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' | Select-Object ProxyServer, ProxyEnable

En mi ejemplo, la dirección y el puerto del servidor proxy son: 192.168.1.100:3128
Servidor proxy habilitado: ProxyEnable = 1

powershell obtiene la configuración del proxy

También puede obtener configuraciones de WebProxy como esta:

[System.Net.WebProxy]::GetDefaultProxy()

PowerShell System.Net.WebProxy GetDefaultProxy

Si es necesario, puede habilitar el uso de proxy con el siguiente comando:

Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' ProxyEnable -value 1

Para deshabilitar el proxy:
Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' ProxyEnable -value 0

¿Establecer la configuración del proxy de Windows mediante PowerShell?

Puede establecer la configuración de proxy para el usuario actual de Windows mediante PowerShell. Por ejemplo, la siguiente función de PowerShell le permite cambiar la configuración del proxy, pero primero verifica la disponibilidad del servidor proxy y la respuesta del puerto usando el cmdlet Test-NetConnection

function Set-Proxy ( $server,$port)
{
If ((Test-NetConnection -ComputerName $server -Port $port).TcpTestSucceeded) {
Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' -name ProxyServer -Value "$($server):$($port)"
Set-ItemProperty -Path 'HKCU:SoftwareMicrosoftWindowsCurrentVersionInternet Settings' -name ProxyEnable -Value 1
}
Else {
Write-Error -Message "Invalid proxy server address or port:  $($server):$($port)"
}
}

Set-Proxy 192.168.1.100 3128

Artículos Interesantes