15/11/2024

PowerShell

Comment utiliser PowerShell derrière un proxy ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à configurer une machine Windows de manière à pouvoir utiliser PowerShell derrière un proxy. De quoi se sortir d'affaire lorsque l'on a besoin de se connecter à Internet avec un script et des commandes PowerShell à partir d'une infrastructure où il y a un proxy sur le réseau.

Lorsque l'on travaille avec PowerShell, on a la possibilité de faire des actions diverses et variées sur Internet :

  • Télécharger un module à partir de la PowerShell Gallery avec la commande Install-Module,
  • Télécharger un fichier sur Internet avec la commande Invoke-WebRequest,
  • Se connecter à un environnement Cloud comme Microsoft Teams avec Connect-MicrosoftTeams ou encore à Exchange Online avec Connect-ExchangeOnline,
  • Installer une nouvelle application le gestionnaire de paquets WinGet,
  • Mettre à jour l'aide de PowerShell avec la commande Update-Help,
  • Etc...

Toutefois, sur un réseau où il faut passer par un proxy pour accéder à Internet, cela peut s'avérer plus compliqué que prévu ! Les messages d'erreurs renvoyés par les commandes seront différents, mais on peut avoir par exemple "Unable to connect to the remote server". Par défaut, PowerShell est configuré pour sortir directement sur Internet, sans prendre en charge un quelconque proxy.

II. Configurer un proxy pour PowerShell

A. Configuration d'un proxy avec netsh

Pour définir un proxy HTTP à utiliser avec PowerShell, le plus simple, c'est d'utiliser la commande netsh avec les options qui vont bien. Tout d'abord, voici comment afficher le serveur proxy actuellement configuré :

netsh winhttp show proxy

netsh winhttp show proxy

Par défaut, la commande retourne "Accès direct (sans serveur proxy).". Ainsi, si l'on souhaite définir le serveur proxy "192.168.1.254:3128", on utilisera cette commande :

netsh winhttp set proxy "192.168.1.254:3128"

Vous pouvez aussi ajouter des exclusions, de manière à ne pas utiliser le proxy pour contacter les machines du réseau local. L'exemple ci-dessous permet de poser une exclusion sur toutes les machines du réseau "192.168.1.X". Il est possible d'ajouter plusieurs valeurs, séparées par une virgule.

netsh winhttp set proxy "192.168.1.254:3128" bypass-list="192.168.1.*"

Si le serveur proxy est déjà configuré au niveau de la machine locale, auprès des options "Internet Explorer", ou plutôt des "Options Internet" de Windows, on peut importer cette configuration via netsh. Je fais référence à ce paramètre :

PowerShell - Proxy Options Internet

D'ailleurs, petite parenthèse, cette configuration est stockée dans le Registre et peut-être lue avec PowerShell :

Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" | Ft ProxyEnable, ProxyServer

Lorsque "ProxyEnable" est égal à zéro, cela signifie que le proxy n'est pas activé (ce qui n'empêche pas d'avoir une valeur de ProxyServer). Sinon, ce paramètre est égal à "1".

À l'aide de netsh, on peut importer cette configuration de proxy avec cette commande :

netsh winhttp import proxy source=ie

La configuration est immédiatement importée :

PowerShell - Importer le proxy IE Windows

A partir du moment où le proxy est configuré, il sera utilisé pour accéder à Internet via PowerShell. Ici, il s'agit d'un proxy sans authentification, mais comment doit-on faire si le proxy implique que l'on s'authentifie ? C'est ce que nous allons voir dans la prochaine partie.

Dernière précision avant de passer à la suite, on peut supprimer la configuration du proxy WinHTTP à tout moment avec cette commande :

netsh winhttp reset proxy

Grâce à la commande ci-dessus, on rétablit l'accès direct sans serveur proxy.

C. S'authentifier auprès du proxy en PowerShell

Une autre méthode consiste à utiliser la classe [System.Net.WebRequest]::DefaultWebProxy qui va aussi nous faciliter la tâche si l'on doit s'authentifier auprès du serveur proxy. Si vous utilisez la méthode ci-dessous, ce n'est pas nécessaire d'exécuter les commandes netsh évoquées précédemment.

Tout d'abord, on commence par définir l'adresse du proxy et le port utilisé. Voici la commande à exécuter si l'on utilise toujours le proxy "192.168.1.254:3128" :

[System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy("http://192.168.1.254:3128")

Ensuite, on peut lui indiquer de ne pas utiliser le proxy lorsqu'il s'agit d'adresses locales :

[System.Net.WebRequest]::DefaultWebProxy.BypassProxyOnLocal = $true

À tout moment, la configuration peut être affichée avec cette commande :

[System.Net.WebRequest]::DefaultWebProxy

Avec cette méthode, on peut également définir des identifiants à utiliser pour s'authentifier sur le proxy. Pour utiliser les identifiants de l'utilisateur Windows actuellement connecté, ce qui sera utile s'il y a l'authentification Active Directory sur le proxy, on utilisera cette commande :

[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

Sinon, on peut préciser clairement un couple nom d'utilisateur/mot de passe en utilisant la commande Get-Credential tout simplement :

[System.Net.WebRequest]::DefaultWebProxy.Credentials = Get-Credential

Voilà, le proxy est configuré et PowerShell peut l'exploiter ! Avec cette méthode, le proxy est défini au sein de la session PowerShell en cours donc il faut inclure ces instructions dans votre script et/ou dans votre profil PowerShell (notepad $PROFILE).

Sinon, pour supprimer le proxy, c'est très simple, on définie une adresse nulle :

[System.Net.HttpWebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy($null)

III. L'utilisation d'un proxy avec Invoke-WebRequest

Si vous cherchez à télécharger un fichier sur Internet avec la commande Invoke-WebRequest, sachez que vous pouvez aussi préciser un proxy à utiliser directement au sein de cette commande. En effet, cette commande a plusieurs paramètres adaptés :

  • -Proxy : spécifier le serveur proxy à utiliser
  • -ProxyCredential : spécifier un nom d'utilisateur et un mot de passe pour s'authentifier auprès du proxy
  • -ProxyUseDefaultCredentials : utiliser les identifiants de l'utilisateur actuel pour s'authentifier auprès du proxy

Voici un exemple d'utilisation où l'on utilise le proxy "http://192.168.1.254:3128" et que l'on s'authentifie avec les identifiants stockés dans $Creds :

$Creds = Get-Credential
Invoke-WebRequest https://domaine.fr/fichier-a-telecharger.ps1 -Proxy "http://192.168.1.254:3128" -ProxyCredential $Creds

Ainsi, PowerShell va solliciter le proxy pour exécuter cette commande. Les autres commandes seront exécutées sans passer par un proxy.

IV. Conclusion

Après avoir mis en pratique l'une des méthodes évoquées dans cet article, vous devriez pouvoir vous connecter à Internet avec PowerShell tout en étant derrière un proxy ! Si vous avez une question, n'hésitez pas à laisser un commentaire sur l'article ou à utiliser notre serveur Discord.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Comment utiliser PowerShell derrière un proxy ?

  • Je suis en entreprise, derrière un proxy, c’est d’ailleurs ce que me retourne comme erreur Invoke-WebRequest : « The proxy could not authenticate the user connecting to the Internet. ».

    Néanmoins, quand j’exécute la commande « netsh winhttp show proxy », ça me dit : « accès direct ».

    Répondre
  • pour faire toutes ces commandes il faut exécuter le powershell en tant qu’administrateur non?

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.