2012-05-24 21 views
60

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.Copie el archivo de forma remota con Powershell

Si eso no se puede hacer entonces me gustaría conectar al servidor B del servidor A y copiar un archivo a otro directorio en el servidor B.

veo que Copy-Item de comandos, pero no veo cómo para darle un nombre de computadora.

yo habría pensado que podía hacer algo así 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?

+3

Para usar Copy-Item tendrá que usar una ruta UNC como "\\ ServerB \ C $ \ Programs \ temp \ test.txt" –

Respuesta

67

Simply use the administrative shares to copy files between systems. It's much easier this way.

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

By using UNC paths instead of local filesystem paths, you help to ensure that your script is executable from any client system with access to those UNC paths. If you use local filesystem paths, then you are cornering yourself into running the script on a specific computer.

Esto sólo funciona cuando se ejecuta PowerShell sesiones en relación con el usuario que tiene derechos para ambas acciones administrativas. Es mejor utilizar la cuota regular de la red en el servidor B con acceso de sólo lectura a todo el mundo y simplemente llamar (del servidor A):

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

Un posible problema con este enfoque es que Copy-Item no admite alternativas credenciales (si tiene que ejecutar el comando con un usuario diferente). En ese caso, se requiere el enfoque New-PSDrive. –

+1

O podría usar 'Invoke-Command'. –

+0

Esta solución solo funciona si no hay un firewall entre los hosts que bloquean los recursos compartidos de UNC. En ese caso, la solución correcta está debajo ('Copy-Item -FromSession'). – Marc

35

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

Nueva PsDrive: crear un nuevo PsDrive ser vistos en el environement PowerShell:

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

uso neto: crear una nueva unidad visible en todas las partes del sistema operativo.

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

Sólo en caso de que el archivo remoto necesita su credencial para ser visitada, se puede generar una System.Net.WebClient objeto utilizando cmdlet New-Object a "Copia de archivos de forma remota", al igual que

$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 tiene que cargar un archivo que puede hacer uso UploadFile

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

$WebClient.UploadFile($Dest, $Source) 
+1

pirateo detectado :) –

+0

@klm_ ¿Puedes explicarme lo que quieres decir? – FastTrack

0

Ninguna de las respuestas anteriores funcionó para mí. Se mantuvo en conseguir 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í este lo hizo por mí:

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

Entonces, desde mi anfitrión mi máquina en el cuadro Ejecutar simplemente hacer esto \ {ip de nanoserver} \ C $

+1

Es probable que haya tenido problemas con compartir + permisos del sistema de archivos. Recuerde que los permisos más restrictivos ganan, por lo que incluso si tiene acceso a la capa del sistema de archivos NTFS, si los permisos de compartir lo restringen, no podrá escribir. :) –

+0

esto no funcionó para mí, todavía recibe el error –

39

A partir de la versión 5 de PowerShell (incluida en Windows Server 2016, downloadable as part of WMF 5 for earlier versions), 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 instalado PowerShell 5 o superior.La sesión remota no requiere necesita tener PowerShell 5 instalado; funciona con versiones de PowerShell de solo 2 y versiones de Windows Server tan bajas como 2008 R2.

De Un servidor, cree una sesión al servidor B:

$b = New-PSSession B 

Y luego, todavía de la A:

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

artículos Copia de B se hace 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.

+2

He encontrado que no es necesario que ambos servidores tengan la PS 5 instalada. Acabo de realizar una prueba exitosa donde solo el servidor de origen (Windows 10) tenía PS 5 instalado. El objetivo era Windows Server 2012 R2 con PS predeterminado instalado ($ PSVersionTable.PSVersion informa 4). –

+2

Si usa -ToSession en la fuente, solo la fuente necesita la PS 5 instalada. Si usa "FromSession" en el destino, solo el destino necesita la PS 5 instalada. –

+1

Esto también funciona cuando solo tiene Hypervisor instalado (sin servidor), no necesita configurar recursos compartidos simplemente use las sesiones. – dashesy

Cuestiones relacionadas