powershell powershell-v2.0

Copie el archivo de forma remota con Powershell



powershell-v2.0 (5)

Estoy escribiendo un script de PowerShell que quiero ejecutar desde el Servidor A. Quiero conectarme al Servidor B y copiar un archivo al Servidor A como una 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 el comando Copy-Item pero no veo cómo darle un nombre de computadora.

Hubiera 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?


Simplemente use los recursos compartidos administrativos para copiar archivos entre sistemas. Es mucho más fácil de esta manera.

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

Al utilizar rutas UNC en lugar de rutas de sistemas de archivos locales, ayuda a garantizar que el script sea ejecutable desde cualquier sistema cliente con acceso a esas rutas UNC. Si utiliza rutas de sistema de archivos locales, entonces se está arrinconando a sí mismo para ejecutar el script en una computadora específica.

Esto solo funciona cuando la sesión de PowerShell se ejecuta en usuario que tiene derechos sobre ambos recursos compartidos administrativos. Sugiero usar el recurso compartido de red habitual en el servidor B con acceso de solo lectura a todos y simplemente llamar (desde el Servidor A):

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


¿Por qué no usa net use o New-PSDrive para crear una nueva unidad?

New-PsDrive: crea un nuevo PsDrive solo visible en el entorno powershell:

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

Uso neto: crea una nueva unidad visible en todas las partes del sistema operativo.

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


Desde la versión 5 de PowerShell en adelante (incluida 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 alguna razón, no puede acceder a los recursos compartidos.

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

Desde el servidor A, crea una sesión en el servidor B:

$b = New-PSSession B

Y luego, aún de A:

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

La copia de elementos a B se realiza con -ToSession . Tenga en cuenta que las rutas locales se utilizan en ambos casos; debe hacer 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 redactarse significa que la copia recursiva de archivos no funciona con -ToSession , una copia aparentemente no trabajar en absoluto con -FromSession .


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 archivo de forma remota", como tal

$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 subir un archivo, puede usar UploadFile

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


Ninguna de las respuestas anteriores funcionó para mí. Seguí 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 servidor, mi máquina en el cuadro Ejecutar simplemente hace esto / {ip of nanoserver} / C $