15/01/2025

PowerShell

Comment utiliser le module WinSCP de PowerShell ?

I. Présentation

WinSCP est un logiciel très pratique pour se connecter sur un serveur distant par l'intermédiaire de plusieurs protocoles : SFTP, SCP, FTP et WebDAV ou sur une instance Amazon S3. Il intègre une bibliothèque avec des fonctions .NET Framework qui permettent de l'utiliser en PowerShell. Ainsi, on peut interagir avec un serveur distant par l'intermédiaire de WinSCP directement dans un script PowerShell. La syntaxe des fonctions n'est pas très user-friendly, mais la bonne nouvelle c'est qu'il existe un module PowerShell "WinSCP" qui va nous simplifier la vie !

Dans ce tutoriel, je vais vous expliquer comment utiliser ce module WinSCP pour vous permettre de l'exploiter par vous-même dans vos scripts PowerShell. Le module est disponible sur GitHub et la PowerShell Gallery, voici les liens :

II. Installer le module WinSCP de PowerShell

Pour installer ce module, c'est classique, il faut s'appuyer sur Install-Module comme ceci :

Install-Module -Name WinSCP

WinSCP PowerShell

Si l'on regarde le contenu du module WinSCP, on remarque qu'il y a un dossier "bin" qui contient directement l'exécutable de WinSCP. Du coup, vous n'avez pas besoin d'installer WinSCP sur votre machine pour exploiter ce module, car il est intégré.

Si vous cherchez où s'est installé le module sur votre machine, utilisez cette commande :

Get-Module winscp | ft Path

Maintenant, nous allons voir comment utiliser ce module WinSCP. Je vais vous montrer quelques exemples d'utilisation et surtout la logique pour l'utiliser. Nous ne verrons pas toutes les commandes : il y en a une vingtaine...

II. Créer une connexion WinSCP avec PowerShell

Ce module permet d'envoyer des fichiers vers un hôte distant, mais également de télécharger des fichiers. Il permet aussi de renommer des fichiers, d'en supprimer, de lister le contenu, etc... Mais avant toute chose, il faut établir une connexion à l'hôte distant.

Pour créer une connexion, il faut tout d'abord définir des paramètres de session. En fait, nous allons utiliser trois commandes : New-WinSCPSessionOption, Get-WinSCPHostKeyFingerprint et New-WinSCPSession.

Intéressons-nous à la commande New-WinSCPSessionOption qui sert à définir les paramètres de la session. On va définir plusieurs paramètres :

  • -Hostname : nom FQDN ou adresse IP de l'hôte distant
  • -Protocol : protocole à utiliser (sftp, scp, webdav, ftp, s3)
  • -PortNumber : port du serveur de destination
  • -Credential : identifiants de connexion
  • -SshHostKeyFingerprint : l'empreinte de la clé de l'hôte distant

Il y a d'autres paramètres, mais nous allons utiliser les 5 ci-dessus pour établir une connexion sur un serveur en SCP (ou SFTP). Ce qui donne, par exemple :

New-WinSCPSessionOption -HostName 192.168.5.150 -Protocol Sftp -PortNumber 22 -Credential (Get-Credential)

Nous devons stocker ces informations dans une variable :

$WinSCPSessionOption = New-WinSCPSessionOption -HostName 192.168.5.150 -Protocol Scp -PortNumber 22 -Credential (Get-Credential)

Ensuite, nous allons utiliser la commande Get-WinSCPHostKeyFingerprint pour récupérer l'empreinte de la clé SSH de l'hôte distant, car on ne peut pas la deviner... On va utiliser nos paramètres de session (paramètre -SessionOption) puis interroger l'hôte distant, puis la valeur sera stockée dans $sshHostKeyFingerprint.

$sshHostKeyFingerprint = Get-WinSCPHostKeyFingerprint -SessionOption $WinSCPSessionOption -Algorithm SHA-256

Ensuite, on va ajouter l'empreinte récupérée à nos paramètres de session :

$WinSCPSessionOption.SshHostKeyFingerprint = $sshHostKeyFingerprint

De manière générale, vous pouvez ajouter/modifier une valeur en suivant la syntaxe ci-dessus. Par exemple pour modifier le port :

$WinSCPSessionOption.PortNumber = 222

Maintenant, on peut monter la connexion vers l'hôte distant avec le cmdlet New-WinSCPSession et en utilisant nos paramètres de connexion (-SessionOption).

$WinSCPSession = New-WinSCPSession -SessionOption ($WinSCPSessionOption)

On peut s'assurer que la connexion est bien active en exécutant la commande suivante :

Get-WinSCPSession

WinSCP PowerShell

III. Envoyer un fichier avec le module WinSCP de PowerShell

Nous allons voir comment envoyer un fichier vers l'hôte distant auquel on s'est connecté. Tout d'abord, on peut lister le contenu du répertoire courant avec Get-WinSCPChildItem. Sur le même principe que Get-ChildItem et Get-Item, il existe la commande Get-WinSCPItem.

Ce sera l'occasion de voir où l'on se situe sur le serveur distant :

Get-WinSCPChildItem -WinSCPSession $WinSCPSession -Path .

Le contenu sera listé ainsi que le dossier courant : de quoi se repérer. En fait, sur le principe à chaque fois que l'on exécute une commande il faut appeler notre session avec -WinSCPSession $WinSCPSession.

Pour envoyer un fichier à partir de notre connexion SCP, on va utiliser le cmdlet Send-WinSCPItem. En complément des options de session, on va utiliser deux paramètres : -Path, c'est-à-dire la source, et -Destination.

Note : en fonction du protocole utilisé, les paramètres ne sont pas les mêmes dans les commandes associées. Si vous recherchez une option spécifique, n'hésitez pas à consulter l'aide du module WinSCP. Par ailleurs, si le serveur distant réagit mal (renvoie une erreur) lorsque vous utilisez le protocole SCP, basculez simplement en SFTP pour voir si cela fonctionne.

Ce qui donne :

Send-WinSCPItem -WinSCPSession $WinSCPSession -Path "C:\temp\fichier.jpg" -Destination "/home/florian/"

Ensuite, si l'on veut vérifier que le fichier est bien arrivé à destination par une commande complémentaire, on va utiliser Get-WinSCPItem :

Get-WinSCPItem -WinSCPSession $WinSCPSession -Path /home/florian/fichier.jpg

On pourrait faire autrement puisqu'il y a un équivalent de Test-Path dans ce module : Test-WinSCPPath, il renvoie aussi un booléen. Ce qui donne :

Test-WinSCPPath -WinSCPSession $WinSCPSession -Path /home/florian/fichier.jpg

Voilà, nous venons d'envoyer un fichier avec succès sur l'hôte distant ! Pour finir, on pourrait avoir besoin de renommer le fichier envoyé, dans ce cas on va utiliser Rename-WinSCPItem. Nous avons besoin de deux paramètres spécifiques : -Path qui correspond au chemin complet vers le fichier et -NewName qui correspond au nouveau nom à associer au fichier.

Pour renommer le fichier "/home/florian/fichier.jpg" en "it-connect.jpg" :

Rename-WinSCPItem -WinSCPSession $WinSCPSession -Path "/home/florian/fichier.jpg" -NewName "it-connect.jpg"

Passons à la suite...

IV. Télécharger un fichier avec le module WinSCP de PowerShell

Nous avons vu comment envoyer un fichier, voyons comment télécharger un fichier du serveur distant vers notre machine locale. Pour cela, on va utiliser Receive-WinSCPItem avec deux options : -RemotePath, c'est-à-dire le chemin complet vers le fichier distant, puis -LocalPath c'est-à-dire le dossier local dans lequel déposer le fichier téléchargé.

Receive-WinSCPItem -WinSCPSession $WinSCPSession -RemotePath /home/florian/fichier.jpg -LocalPath "C:\"

Si l'on ajoute le paramètre -Remove, il sera supprimé automatiquement du répertoire distant.

Receive-WinSCPItem -WinSCPSession $WinSCPSession -RemotePath /home/florian/fichier.jpg -LocalPath "C:\" -Remove

Il faut savoir que ce paramètre -Remove fonctionne aussi avec la commande Send-WinSCPItem.

V. Supprimer un fichier avec le module WinSCP de PowerShell

La suppression d'un fichier passe par l'utilisation de Remove-WinSCPItem, on va lui spécifier simplement le chemin vers le fichier à supprimer avec -Path. En complément, on positionnera le paramètre -Confirm sur $false pour supprimer la demande de confirmation.

Remove-WinSCPItem -WinSCPSession $WinSCPSession -Path "/home/florian/fichier.jpg" -Confirm:$false

VI. Fermer la session WinSCP

Pour finir et faire les choses proprement, on va fermer la session WinSCP à la fin :

Remove-WinSCPSession

A vous de jouer maintenant !

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

3 commentaires sur “Comment utiliser le module WinSCP de PowerShell ?

  • Bonjours
    Svp
    Vous n’avait pas un module complet (scripte)
    – upload
    – download

    Pas de reponse:
    Get-Module winscp | ft Path

    Pour les : -Credential (Get-Credential)
    Je fait comment?

    Get-help winscp ?

    Merci
    Arnold

    Ps: Vous allez me donner une répons? Merci

    Répondre
    • Demande à ChatGPT :

      # Définir les informations d’identification (username et password)
      $username = « votre_nom_d_utilisateur »
      $password = ConvertTo-SecureString « votre_mot_de_passe » -AsPlainText -Force

      # Créer une option de session WinSCP avec les informations d’identification définies
      $sessionOptions = New-WinSCPSessionOption -HostName 192.168.5.150 -Protocol Sftp -PortNumber 22 -Credential (New-Object System.Management.Automation.PSCredential($username, $password))

      # Vous pouvez maintenant utiliser $sessionOptions pour créer une session WinSCP

      PS : Stocker les credential en clair dans le script est une mauvaise pratique.. mais parfois il le faut, sécurise bien le script.

      Répondre
  • Bonjour,

    Y’a moyen de faire ça avec une fonction simple (nécessite que `Install-Module WinSCP` ait été lancée au-moins une fois correctement) :
    « `powershell
    function Send-WinScpCommand ([string]$command, [string]$connection = « sftp://username:[email protected]/ », [string]$hostkey = « * », [string]$WinSCPDirectory = « $((Get-Module winscp).Path)\..\bin\ ») {
    Write-Host $command
    pushd; cd « $WinSCPDirectory »
    .\winscp.exe -loglevel=1 /log= »C:\Temp\WinSCP.log » -command « open $connection -hostkey=$hostkey » « $command » « close » « exit » | Out-Null # Sync wait
    popd
    }
    « `

    Pour l’utiliser ensuite :
    « `powershell
    Send-WinScpCommand « get ` »` »/ftpdir/fichier_distant.txt` »` » ` »` »c:\temp\fichier_local.txt` »` » »
    Send-WinScpCommand « put ` »` »c:\temp\fichier_local.txt` »` » ` »` »/ftpdir/fichier_distant.txt` »` » »
    « `

    En espérant que ça vous serve.

    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.