web-dev-qa-db-fra.com

Copier le fichier à distance avec PowerShell

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

Si cela ne peut pas être fait, j'aimerais 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é pouvoir 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?

80
chobo2

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 d'accès UNC au lieu de chemins d'accès au système de fichiers local, vous aidez à vous assurer que votre script est exécutable à partir de tout système client ayant accès à ces chemins d'accès UNC. Si vous utilisez des chemins d'accès au système de fichiers locaux, vous vous engagez à exécuter le script sur un ordinateur spécifique.

Cela ne fonctionne que lorsqu'une session PowerShell s'exécute sous l'utilisateur disposant des droits sur les deux partages administratifs.

Je suggère d'utiliser un partage réseau normal sur le serveur B avec un accès en lecture seule à tout le monde et d'appeler simplement (depuis le serveur A):

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

À partir de version 5 de PowerShell (inclus dans Windows Server 2016, téléchargeable dans le cadre de WMF 5 pour les versions antérieures ), il s'agit possible avec remoting. L'avantage de ceci est que cela fonctionne même si, pour une raison quelconque, vous ne pouvez pas accéder aux partages.

Pour que cela fonctionne, PowerShell version 5 ou supérieure doit être installée sur la session locale où la copie est lancée. La session distante ne nécessite pas l'installation de PowerShell 5; elle fonctionne avec les versions de PowerShell à partir de 2 et les versions de Windows Server à partir de 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 des éléments vers B s'effectue avec -ToSession. Notez que les chemins locaux sont utilisés dans les deux cas; vous devez garder une trace de votre serveur.


[1]: lors de la copie depuis ou vers un serveur distant ne disposant que de PowerShell 2, méfiez-vous de ce bogue dans PowerShell 5.1 , ce qui signifie qu'au moment de l'écriture, la copie de fichier récursive ne fonctionne pas avec -ToSession, une copie apparente ne fonctionne pas du tout avec -FromSession.

64
Jeroen Mostert

Utilisez Net Use ou New-PSDrive pour créer un nouveau lecteur:

New-PsDrive: créer un nouveau PsDrive visible uniquement dans l'environnement PowerShell:

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

Net Use: créer un nouveau lecteur visible dans toutes les parties du système d'exploitation.

Net Use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy
36
JPBlanc

Au cas où le fichier distant aurait besoin de vos informations d'identification, vous pouvez générer un objet System.Net.WebClient à l'aide de la cmdlet New-Object vers "Copier le fichier à distance", ainsi

$Source = "\\192.168.x.x\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.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)
13
shyan1

Aucun Des réponses ci-dessus ont fonctionné pour moi. J'ai gardé cette erreur:

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

Donc this l'a fait pour moi:

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

Ensuite, depuis mon hôte, ma machine dans la boîte de dialogue Exécuter, je viens de faire ceci:

\\{IP address of nanoserver}\C$
0
RogerW