Es fácil copiar archivos por medio de la línea de comando con el Copy-Item de PowerShell. Una vez que se especifica el origen y el destinatario, simplemente todo ocurre. Desafortunadamente, muchos administradores no piensan cómo funciona este proceso hasta que deja de funcionar. Aunque no piense sobre esto ni un poquito, todas las comunicaciones de red TCP (como copias de archivos SMB) usan puertos de redes para que todos los bits se transfieran. Un puerto necesita estar abierto hasta el nodo de destinatario, para que el proceso de copia de archivo del punto A al punto B pueda suceder. En el caso de copia de archivo SMB, el puerto es 445. Este es un puerto común que normalmente está abierto al inicio, con la excepción de situaciones de alta seguridad o aquellas que pasan una zona desmilitarizada (DMZ).
El Copy-Item de PowerShell
Si se encuentra en un ambiente de alta seguridad o necesita transferir archivos desde una red internacional a una zona desmilitarizada que tenga varias restricciones en los puertos, ¿cómo se puede asegurar de que sus scripts son capaces de copiar archivos a los nodos todo el tiempo? Una opción es usar el comándulo Copy-Item con el nuevo parámetro -ToSession del PowerShell v5.
Este parámetro fue introducido con el Windows Management Framework (WMF) v5 conjunto con el comándulo Copy-Item. Proporciona una manera de transferir archivos sobre el mismo enlace que podría usar hoy para ejecutar comandos remotamente en computadoras con comándulos como el Invoke-Command.
Este proceso tiene unas cuantas ventajas, pero los beneficios incluidos más grandes son los puertos TCP: 5985 (HTTP) y 5986 (HTTPS). Típicamente, estos puertos están abiertos para administrar nodos remotos, a veces hasta a un ambiente de DMZ. Al utilizar Copy-Item –ToSession, un administrador puede asegurarse de que los archivos están siendo copiados sin importar si el SMB está bloqueado o no.
Cuando está usando el Copy-Item de PowerShell a través del método tradicional de SMB, necesita especificar parámetros de trayectoria (Path) y destinatario (Destination). Si desea copiar un archivo llamado file1.txt dentro de C:\Folder a una computadora remota SERVER1 en su C:\, podría hacer los siguiente:
Copy-Item –Path C:\Folder1\file1.txt –Destination '\\SERVER1\c$'
Es importante notar que usamos la trayectoria UNC \\SERVER1\c$. Esto será importante en un minuto.
Remoting de las sesiones de PowerShell
¿Pero qué tal si por alguna razón el SMB está bloqueado o está usando el Invoke-Command para ejecutar los comandos de SERVER1 de todos modos? Puede aprovecharse del remoting de las sesiones para transferirle el archivo a WinRM en vez de a SMB. Para hacer esto, necesita establecer un nuevo remoting de las sesiones y luego pasarle el archivo a esa sesión.
Primero, necesita crear una nueva sesión de remoting en PowerShell. Para hacer esto, puede usar el New-PSSession cmdlet y asignarle la sesión a la variable $sesión.
$session = New-PSSession –ComputerName SERVER1
Esto usara la autentificación de Kerberos para establecer una sesión de remoting de PowerShell. Este es el método más comúnmente usado en un ambiente de Directorio Activo.
Después, necesitara especificar el parámetro ToSession y una trayectoria local en la computadora remota para el parámetro Destination.
Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession $session
Dese cuenta que ahora está usando C:\ para el destinatario en vez de la trayectoria UNC. Este comando lograra lo mismo que el anterior, pero usara la sesión para encapsular el archivo y transferirlo vía WinRM.
Que no se le olvide eliminar la sesión en cuanto termine de usar el Remove-PSSession.
$session | Remove-PSSession
Si no tiene la intención de reutilizar la sesión para otra cosa, puede crear y eliminar la sesión al mismo tiempo.
Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession (New-PSSession –ComputerName SERVER1)
¡Eso es todo lo que tiene que hacer! A la próxima que se encuentre en un ambiente en el que el remoting de PowerShell esté permitido per el SMB restringido, o esté usando una sesión de remoting para otra cosa, puede pasar la sesión a Copy-Item para mover su archivo del punto A al punto B.
Adam Bertram
Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.