PSRemoting (Parte 3): Cómo utilizar PowerShell Remoting

Ahora que tenemos claro qué es PowerShell Remoting y cómo habilitarlo es hora de pasar a la acción. En la entrada de hoy veremos las distintas formas de utilizar PowerShell Remoting para poder sacar el máximo partido a esta tecnología.

Aquí tenéis el índice de la serie:

Cómo utilizar PowerShell Remoting

PowerShell Remoting de forma interactiva con Enter-PSSession

Como decía en la introducción de la entrada, existen distintas formas de utilizar PowerShell Remoting. La primera que veremos será la sesión interactiva, cuya funcionalidad gira entorno al cmdlet Enter-PSSession.

¿Qué es el modo interactivo de PowerShell Remoting?

Podemos pensar en el modo interactivo de PowerShell Remoting como en el Telnet o SSH de PowerShell. Cuando iniciamos una sesión interactiva de PSRemoting contra una máquina remota obtenemos una sesión de PowerShell que a todos los efectos es como si la ejecutáramos en dicha máquina. Los comandos ejecutados durante una sesión interactiva se ejecutarán en la máquina remota y serán mostrados en nuestra consola de PowerShell.

Cuando utilizamos Enter-PSSession debemos tener ciertas cosas en consideración:

  • Como hemos indicado anteriormente, los comandos se ejecutan en la máquina remota.
  • Por lo indicado en el punto anterior los módulos de PowerShell que queramos utilizar deberán existir en la máquina destino, así como variables de entorno, archivos y cualquier cosa que invoquemos desde la sesión remota.
  • Sólo se puede ejecutar una sesión remota a la vez en una misma consola de PowerShell.
  • Cuando iniciamos la conexión no se utiliza ningún perfil de PowerShell.
  • No se puede hacer una nueva sesión remota desde una ya existente.
Cómo utilizar PowerShell Remoting de forma interactiva

Utilizar PowerShell Remoting de forma interactiva es muy sencillo. Si PSRemoting está habilitado lo único que deberemos hacer es ejecutar:

# En un entorno de dominio no requeriremos introducir credenciales si estamos logeados con un usuario con permisos de administrador en la máquina destino:
Enter-PSSession -ComputerName DC01
# De no ser así podemos aportar las credenciales:
$Creds = Get-Credential
Enter-PSSession -ComputerName DC01 -Credential $Creds

Una vez estemos logeados en la máquina remota deberíamos ver algo parecido a esto:

Sesión PSRemoting con Enter-PSSession

Como podemos ver el principio de nuestro prompt ha cambiado y ahora podemos ver el nombre de la máquina seguido de dos puntos ([DC01]:), lo que nos ayudará a distinguir la máquina en la que vamos a ejecutar nuestros comandos.

Si queremos comprobar que realmente estamos en la máquina remota podemos ejecutar hostname:

Hostname en Enter-PSSession

A partir de aquí somos libres de ejecutar las acciones que requiramos y cuando queramos salir únicamente deberemos ejecutar exit para volver a nuestra sesión local.

Ejecutar comandos remotos con PowerShell Remoting

Otra forma de ejecutar PowerShell Remoting es mediante la ejecución remota de comandos, que como veremos a continuación desbloquea algunas opciones interesantes para nuestras automatizaciones.

¿En qué consiste la ejecución remota de comandos con PowerShell Remoting?

La ejecución remota de comandos con PowerShell Remoting consiste en mandar uno o más comando para ser ejecutados en la máquina remota. La diferencia fundamental con la sesión interactiva es que después de la ejecución de nuestros comandos se nos devuelve el control del prompt en nuestra máquina local.

Los puntos a tener en cuenta en este modo son los mismos que en la sesión interactiva. Este tipo de ejecución, en contra de lo que ocurre en la sesión interactiva, nos va a permitir ejecutar comandos remotos a múltiples máquinas a la vez de forma paralela.

Ejecutar comandos remotos de PowerShell Remoting contra una sola máquina (1:1)

Para ejecutar comandos de forma remota utilizando PowerShell Remoting utilizaremos Invoke-Command.

Hay distintas formas de pasar los comandos a nuestra máquina remota. Para empezar podemos utiliza el parámetro -ScriptBlock, con el que enviaremos los comandos directamente desde Invoke-Command:

Invoke-Command con ScriptBlock

Aquí podemos ver un par de cosas interesantes:

  • El contenido de -ScriptBlock debe ir entre {} y tenemos total libertad para escribir las órdenes que deseemos.
  • La salida del ScriptBlock es la misma que si lo ejecutáramos en local con la diferencia de que se añade una propiedad PSComputerName que indica la máquina en la que se ha ejecutado el ScriptBlock.

En el caso de que queramos enviar órdenes complejas es posible que escribir todo dentro del ScriptBlock resulte poco usable. Es por ello que podemos valernos de -FilePath, un parámetro que nos permitirá pasarle un archivo .ps1 con el script a ejecutar de forma remota.

Invoke-Command con FilePath

Como podemos ver la salida es la misma, pero no hemos tenido que escribir los comandos dentro de Invoke-Command.

Ejecutar comandos remotos de PowerShell Remoting contra múltiples máquinas (1:N)

Donde Invoke-Command alcanza todo su potencial es en la ejecución contra múltiples máquinas a la vez. Invoke-Command nos permite reducir tareas que implicarían horas a unos pocos segundos gracias a su ejecución masiva.

Si queremos ejecutar una tarea contra múltiples máquinas a la vez únicamente deberemos facilitar un parámetro -ComputerName con los nombres de todas las máquinas contra las que ejecutar nuestros comandos:

Invoke-Command multiples destinos

En este caso coge más sentido la propiedad PSComputerName, que nos permitirá diferenciar a qué máquina corresponde cada línea. Aquí podemos ver que DC01 tiene más shares que SRV01 puesto que se trata de un DC.

Algo interesante de Invoke-Command es que por defecto nos permite la ejecución en paralelo en todas las máquinas que facilitemos. Esto se resume en tiempos mucho más cortos a la hora de ejecutar tareas de forma masiva. Veamos un ejemplo en el que ejecutamos Get-Process en nuestras dos máquinas:

Invoke-Command multiples destinos tiempos

Como podemos ver por los tiempos de respuesta, cuando ejecutamos Get-Process sobre las máquinas individuales tardamos unos 7-10 segundos en obtener la respuesta. Al lanzarlo sobre ambas máquinas a la vez el comando se ejecuta en el mismo tiempo. Evidentemente esta ganancia de tiempo será cada vez mayor conforme aumentemos el número de máquinas a procesar.

Estos tiempos pueden variar según la carga de los servidores y de la latencia de la red, pero nos ayudan a darnos cuenta de la ejecución paralelizada de Invoke-Command.

Conclusión

Hasta aquí esta nueva entrega sobre PowerShell Remoting. Os recomiendo que introduzcáis ésta tecnología en vuestras automatizaciones ya que os harán la vida mucho más facil y os ahorrará una cantidad de tiempo brutal.

¡Nos vemos en la próxima!


Deja un comentario