Copier le fichier à distance avec Powershell

J’écris un script PowerShell que je veux exécuter à partir du serveur A. Je veux me connecter au serveur B et copier un fichier sur le serveur A en tant que sauvegarde.

Si cela ne peut pas être fait, je voudrais me connecter au serveur B à partir du serveur A et copier un fichier dans un autre répertoire du serveur B.

Je vois la commande Copy-Item mais je ne vois pas comment lui donner un nom d’ordinateur.

J’aurais pensé que je pourrais faire quelque chose comme

 Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA) 

Comment puis-je faire ceci?

Utilisez simplement les partages administratifs pour copier des fichiers entre systèmes. C’est beaucoup plus facile de cette façon.

 Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt; 

En utilisant des chemins UNC au lieu de chemins de système de fichiers locaux, vous consortingbuez à garantir que votre script est exécutable à partir de tout système client ayant access à ces chemins UNC. Si vous utilisez des chemins d’access au système de fichiers local, vous vous retrouvez à exécuter le script sur un ordinateur spécifique.

Cela ne fonctionne que lorsque la session PowerShell s’exécute sous un utilisateur disposant des droits sur les deux partages administratifs. Je suggère d’utiliser le partage réseau régulier sur le serveur B avec un access en lecture seule à tout le monde et d’appeler simplement (à partir du serveur A):

 Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose 

À partir de la version 5 de PowerShell (incluse dans Windows Server 2016, téléchargeable dans le cadre de WMF 5 pour les versions antérieures ), cela est possible avec la communication à distance. L’avantage est que cela fonctionne même si, pour une raison quelconque, vous ne pouvez pas accéder aux partages.

Pour que cela fonctionne, la session locale où la copie est lancée doit avoir PowerShell 5 ou une version ultérieure. PowerShell 5 n’a pas besoin d’être installé sur la session distante – il fonctionne avec les versions PowerShell inférieures à 2 et les versions Windows Server dès 2008 R2. [1]

Depuis le serveur A, créez une session sur le serveur B:

 $b = New-PSSession B 

Et puis, toujours de A:

 Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt 

La copie d’éléments à B se fait avec -ToSession . Notez que les chemins locaux sont utilisés dans les deux cas; vous devez garder une trace de quel serveur vous êtes sur.


[1]: lors de la copie depuis ou vers un serveur distant disposant uniquement de PowerShell 2, méfiez-vous de ce bogue dans PowerShell 5.1 qui, au moment de la rédaction, signifie que la copie de fichiers récursive ne fonctionne pas avec -ToSession travailler du tout avec -FromSession .

Pourquoi n’utilisez-vous pas net use ou New-PSDrive pour créer un nouveau lecteur?

New-PsDrive: crée un nouveau PsDrive visible uniquement dans un environnement Powershell:

 New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share Copy-Item BigFile Y:\BigFileCopy 

Net use: créez un nouveau disque visible dans toutes les parties du système d’exploitation.

 Net use y: \\ServerName\Share Copy-Item BigFile Y:\BigFileCopy 

Juste au cas où le fichier distant nécessite l’access à vos informations d’identification, vous pouvez générer un object System.Net.WebClient en utilisant l’applet de commande New-Object pour “Copier le fichier à distance”, comme ceci

 $Source = "\\192.168.xx\somefile.txt" $Dest = "C:\Users\user\somefile.txt" $Username = "username" $Password = "password" $WebClient = New-Object System.Net.WebClient $WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) $WebClient.DownloadFile($Source, $Dest) 

Ou si vous avez besoin de télécharger un fichier, vous pouvez utiliser UploadFile

 $Dest = "\\192.168.xx\somefile.txt" $Source = "C:\Users\user\somefile.txt" $WebClient.UploadFile($Dest, $Source) 

Aucune des réponses ci-dessus n’a fonctionné pour moi. Gardé pour obtenir cette erreur:

 Copy-Item : Access is denied + CategoryInfo : PermissionDenied: (\\192.168.1.100\Shared\test.txt:Ssortingng) [Copy-Item], UnauthorizedAccessException> + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand 

Alors ça l’a fait pour moi:

 netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes 

Ensuite, à partir de mon hôte, ma machine dans la boîte de dialog Exécuter ne fait que cette \ {ip de nanoserver} \ C $