Comment utiliser PowerShell derrière un proxy ?
Sommaire
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
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 :
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 :
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.
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 ».
pour faire toutes ces commandes il faut exécuter le powershell en tant qu’administrateur non?