Copiar archivos de forma remota con Powershell


Estoy escribiendo un script powershell que quiero ejecutar desde el servidor A. Quiero conectarme al Servidor B y copiar un archivo al Servidor A como copia de seguridad.

Si eso no se puede hacer, me gustaría conectarme al Servidor B desde el Servidor A y copiar un archivo a otro directorio en el Servidor B.

Veo que Copy-Item comando, pero no veo cómo darle un nombre de equipo.

Habría pensado que podría hacer algo como

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

¿Cómo puedo hacer esto?

Author: A-Sharabiani, 2012-05-24

5 answers

Simplemente use los recursos compartidos administrativos para copiar archivos entre sistemas. Es mucho más fácil así.

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

Al usar rutas UNC en lugar de rutas locales del sistema de archivos, ayuda a asegúrese de que su script es ejecutable desde cualquier sistema cliente con acceso a esas rutas UNC. Si usa rutas locales del sistema de archivos, entonces te estás acorralando para ejecutar el script en una computadora específica.

Esto solo funciona cuando la sesión de PowerShell se ejecuta bajo un usuario que tiene derechos sobre ambas acciones administrativas. Sugiero usar el recurso compartido de red regular en el servidor B con acceso de solo lectura para todos y simplemente llamar (desde el Servidor A):

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose
 77
Author: Trevor Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-09 16:45:34

Desde PowerShell versión 5 en adelante (incluido en Windows Server 2016, descargable como parte de WMF 5 para versiones anteriores), esto es posible con la comunicación remota. El beneficio de esto es que funciona incluso si, por cualquier razón, no puede acceder a acciones.

Para que esto funcione, la sesión local donde se inicia la copia debe tener PowerShell 5 o superior instalado. La sesión remota no necesita tener PowerShell 5 instalado works funciona con PowerShell versiones tan bajas como 2, y versiones de Windows Server tan bajas como 2008 R2.[1]

Desde el servidor A, cree una sesión al servidor B:

$b = New-PSSession B

Y luego, todavía de A:

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

Copiar elementos a B se hace con -ToSession. Tenga en cuenta que las rutas locales se utilizan en ambos casos; debe realizar un seguimiento del servidor en el que se encuentra.


[1]: al copiar desde o hacia un servidor remoto que solo tiene PowerShell 2, tenga cuidado con este error en PowerShell 5.1 , que en el momento de escribir significa que la copia recursiva de archivos no funciona con -ToSession, una copia aparentemente no funciona en absoluto con -FromSession.

 54
Author: Jeroen Mostert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 12:40:18

¿por Qué no utilizar net use o New-PSDrive para crear una nueva unidad.

New-PSDrive: crear un nuevo PSDrive solo visible en el entorno de powershell:

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

Net use: cree una nueva unidad visible en todas las partes del sistema operativo.

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy
 36
Author: JPBlanc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-24 17:11:40

En caso de que el archivo remoto necesite su credencial para acceder, puede generar un objeto System.Net.WebClient utilizando cmdlet New-Object para "Copiar el archivo de forma remota", como

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

O si necesita cargar un archivo, puede usar UploadFile

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)
 13
Author: Scott YAN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-23 21:12:38

Ninguna de las respuestas anteriores funcionó para mí. Siguió recibiendo este error:

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

Así que esto lo hizo por mí:

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

Luego desde mi host mi máquina en el cuadro Ejecutar simplemente haga esto \{ip de nanoserver}\C {

 0
Author: RogerW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-20 09:55:33