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 $