Copia file in remoto con PowerShell

Sto scrivendo uno script PowerShell che voglio eseguire dal server A. Voglio collegarmi al server B e copiare un file sul server A come backup.

Se ciò non può essere fatto, mi piacerebbe collegarmi al Server B dal Server A e copiare un file in un’altra directory nel Server B.

Vedo che comando Copy-Item ma non vedo come dargli un nome computer.

Avrei pensato di poter fare qualcosa del genere

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

Come posso fare questo?

Basta usare le condivisioni amministrative per copiare file tra sistemi. È molto più facile in questo modo.

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

Utilizzando percorsi UNC anziché percorsi di file system locali, si contribuisce a garantire che lo script sia eseguibile da qualsiasi sistema client con accesso a tali percorsi UNC. Se si utilizzano percorsi di filesystem locali, allora ci si sta concentrando sull’esecuzione dello script su un computer specifico.

Funziona solo quando la sessione di PowerShell viene eseguita con un utente con diritti su entrambe le condivisioni amministrative. Suggerisco di utilizzare una condivisione di rete regolare sul server B con accesso di sola lettura a tutti e semplicemente chiamare (dal server A):

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

Da PowerShell versione 5 in poi (incluso in Windows Server 2016, scaricabile come parte di WMF 5 per versioni precedenti ), ciò è ansible con il servizio remoto. Il vantaggio di questo è che funziona anche se, per qualsiasi motivo, non è ansible accedere alle condivisioni.

Perché ciò avvenga, la sessione locale in cui viene avviata la copia deve avere PowerShell 5 o versione successiva installata. La sessione remota non ha bisogno di avere PowerShell 5 installato – funziona con versioni di PowerShell a partire da 2 e versioni di Windows Server a partire da 2008 R2. [1]

Dal server A, creare una sessione sul server B:

 $b = New-PSSession B 

E poi, ancora da A:

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

La copia degli elementi su B viene eseguita con -ToSession . Si noti che i percorsi locali vengono utilizzati in entrambi i casi; devi tenere traccia del server in cui ti trovi.


[1]: quando si copia da o verso un server remoto dotato solo di PowerShell 2, fare attenzione a questo errore in PowerShell 5.1 , che al momento della scrittura significa che la copia di file ricorsiva non funziona con -ToSession , una copia apparentemente non funziona affatto con -FromSession .

Perché non usi net use o New-PSDrive per creare una nuova unità.

New-PsDrive: crea un nuovo PsDrive visibile solo nell’ambiente PowerShell:

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

Utilizzo netto: creare una nuova unità visibile in tutte le parti del sistema operativo.

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

Nel caso in cui il file remoto necessiti delle credenziali per l’accesso, è ansible generare un object System.Net.WebClient utilizzando il cmdlet New-Object su “Copia file in remoto”, ad esempio

 $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) 

O se hai bisogno di caricare un file puoi usare UploadFile

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

Nessuna delle risposte di cui sopra ha funzionato per me. Continuato a ottenere questo errore:

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

Quindi questo lo ha fatto per me:

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

Quindi dal mio host la mia macchina nella casella Esegui, esegui questo \ {ip di nanoserver} \ C $