Il est très facile de copier des fichiers avec l'applet Copy-Item de PowerShell depuis la ligne de commande. Après avoir précisé la source et la destination, le reste est automatique. Malheureusement, nombreux sont les administrateurs qui ne pensent pas à la façon dont ce processus se déroule...sauf lorsqu'il ne fonctionne pas.
Que vous y pensiez ou non, toutes les communications des réseaux TCP (comme les copies de fichiers via SMB) utilisent les ports réseau pour effectuer les transferts de bits. Pour qu'un processus de copie de fichiers puisse amener un fichier d'un point A à un point B, un port doit être ouvert intégralement jusqu'au nœud de destination. Dans le cas d'une copie de fichiers via SMB, ce port est le 445. Il s'agit d'un port ordinaire, généralement ouvert en interne, sauf dans certaines situations où la sécurité est élevée, ou encore dans une DMZ.
Copy-Item de PowerShell
Si vous travaillez dans un environnement ultra-sécurisé ou si vous avez besoin de transférer des fichiers depuis un réseau interne vers une DMZ susceptible de présenter différentes restrictions au niveau des ports, comment vous assurer que vos scripts pourront copier des fichiers vers les nœuds à tout moment ? Une façon de vous en assurer consiste à utiliser l'applet de commande Copy-Item de PowerShell v5 avec le nouveau paramètre –ToSession.
Ce paramètre a été intégré pour la première fois à Windows Management Framework (WMF) v5 avec l'applet de commande Copy-Item. Il permet de transférer des fichiers sur la même liaison que vous utiliseriez aujourd'hui pour exécuter des commandes à distance sur des ordinateurs avec des applets de commande comme Invoke-Command.
Ce processus présente quelques avantages différents. Mais il est surtout intéressant pour les ports TCP qu'il utilise : 5985 (HTTP) et 5986 (HTTPS). Ces ports standard sont généralement ouverts pour gérer les nœuds à distance, parfois même dans un environnement de DMZ. En utilisant Copy-Item –ToSession, un administrateur peut s'assurer que les fichiers seront toujours copiés, que le protocole SMB soit ou non bloqué.
Lorsque vous utilisez Copy-Item de PowerShell à l'aide de la méthode SMB traditionnelle, vous devez préciser les paramètres Path (chemin) et Destination. Si vous souhaitez copier un fichier appelé fichier1.txt dans C:\Dossier sur un ordinateur distant SERVEUR1 sur son C:\, vous pouvez procéder comme suit :
Copy-Item –Path C:\Folder1\file1.txt –Destination '\\SERVER1\c$'
Notez que vous utilisez le chemin UNC de \\SERVEUR1\c$ ici. Vous en comprendrez l'importance dans une minute.
Sessions distantes PowerShell
Mais que se passe-t-il si, pour une raison quelconque, SMB est bloqué ou si vous utilisez Invoke-Command pour exécuter des commandes sur SERVEUR1 malgré tout ? Vous pouvez tirer parti des sessions distantes PowerShell afin de transférer le fichier via WinRM au lieu de SMB. Pour ce faire, vous devez établir une nouvelle session à distance, puis transférer le fichier via cette session.
Tout d'abord, vous devez créer une nouvelle session PowerShell distante. Pour ce faire, vous pouvez utiliser la commande d'applet New-PSSession et assigner la session à la variable $session.
$session = New-PSSession –ComputerName SERVER1
Une nouvelle session PowerShell distante sera alors établie avec l'authentification Kerberos, la méthode la plus courante dans un environnement Active Directory.
Ensuite, vous devez préciser le paramètre ToSession ainsi qu'un chemin local sur l'ordinateur distant pour le paramètre Destination.
Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession $session
Notez que vous utilisez maintenant C:\ comme destination au lieu d'un chemin UNC. Cette commande produit exactement le même résultat que votre commande précédente, si ce n'est qu'elle utilisera la session pour encapsuler le fichier et le transférer via WinRM.
Lorsque vous aurez terminé, n'oubliez pas de supprimer la session avec Remove-PSSession.
$session | Remove-PSSession
Si vous n'avez pas l'intention de réutiliser la session ultérieurement, vous pouvez également créer la session puis la détruire (le tout en même temps).
Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession (New-PSSession –ComputerName SERVER1)
Et c'est tout ! La prochaine fois que vous vous trouverez dans un environnement où les sessions PowerShell distantes sont autorisées mais où le protocole SMB est restreint, ou si vous utilisez déjà une session distante pour autre chose, vous pouvez transférer la session vers Copy-Item afin de copier aisément votre fichier d'un point A vers un point B.
Adam Bertram
Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.