Pide tu presupuesto ya!

Cómo aprovechar las sesiones remotas de PS reutilizables en sus scripts

PowerShell Remoting (PS Remoting) le permite ejecutar código PowerShell en máquinas remotas como si estuviera sentado frente a ellas. Este tutorial lo guiará a través de la creación y administración de sesiones de PS, permitiéndole ejecutar comandos en una o miles de máquinas de manera eficiente.

Las sesiones reutilizables son clave para maximizar el potencial de PS Remoting. Al establecer una conexión persistente, puede evitar la sobrecarga de autenticar y configurar nuevas sesiones repetidamente. Este enfoque mejora el rendimiento y simplifica el diseño del guión.

Para seguir adelante, necesitará una consola PowerShell y al menos una computadora remota a la que se pueda acceder a través de PS Remoting. ¡Vamos a sumergirnos!

Crear una nueva sesión de PowerShell

El New-PSSession cmdlet es su puerta de entrada a la máquina remota. Almacenaremos el objeto de sesión en una variable para facilitar la referencia.

$session = New-PSSession -ComputerName SRV2

Este comando crea una sesión con la computadora llamada “SRV2”. Puede sustituir el nombre real de su máquina remota.

Mis dos computadoras están en el mismo dominio de Active Directory, por lo que no se requiere autenticación adicional.

Si miras el $session variable, verá que PS Remoting utiliza el protocolo WSman para la comunicación, el estado y otra información valiosa.

Listado de sesiones activas

¿Quieres ver qué sesiones están activas? Get-PSSession proporciona una lista

Esto le brinda una descripción general de las sesiones abiertas, incluidos los nombres de las computadoras a las que están conectadas. Debería ver el mismo resultado al inspeccionar el $session variable ya que solo tenemos una única sesión abierta.

Con una sesión establecida, puede enviar comandos usando Invoke-Command.

Invoke-Command -Session $session -ScriptBlock { hostname }

-Session $session especifica la sesión que creamos anteriormente y ScriptBlock { hostname }define un bloque de código para ejecutar en la máquina remota. En este caso, simplemente solicitamos el nombre de host de la computadora.

El resultado confirmará que efectivamente estás viendo el nombre de host de la máquina remota.

Almacenamiento y recuperación de variables en una sesión

Las sesiones pueden mantener el estado. Creemos una variable en la máquina remota y recuperémosla más tarde:

Invoke-Command -Session $session -ScriptBlock { $foo = 'Please be here next time' }

Aquí estoy definiendo una variable dentro del bloque de script que pasa ese código a la máquina remota y se ejecuta en el contexto de la sesión. Como guardé la sesión, puedo hacer referencia a esa misma sesión nuevamente y acceder al valor de la variable.

Invoke-Command -Session $session -ScriptBlock { $foo }

Observe cómo el segundo Invoke-Command puede acceder al $foo variable que definimos anteriormente.

Crear una función para usar una sesión compartida

Digamos que tiene una función que elimina una carpeta en una computadora local. Sólo estoy usando esto como ejemplo simple; la función podría hacer cualquier cosa.

function Remove-FileFolder {
	param($Path)
	Remove-Item -Path $Path
}

Ahora, tal vez le gustaría que esta función realice la misma tarea en una computadora remota. Una forma de hacerlo es mediante una sesión de PS Remoting.

Para hacer eso, puede agregar un parámetro de sesión a la función.

function Remove-FileFolder {
	param(
		[Parameter(Mandatory)]
		[string]$Path,
		
		[Parameter(Mandatory)]
		[System.Management.Automation.Runspaces.PSSession]$Session
	)
}

Siempre debes definir un tipo para los parámetros. Para obtener el tipo de sesión, puede canalizar el objeto de sesión creado anteriormente a Get-Member.

Luego debes refactorizar el código para usar Invoke-Command para ejecutar la eliminación de forma remota.

Invoke-Command -Session $Session {	Remove-Item -Path $using:Path }

Observe la $using ¿construir? que le permite pasar el $Path variable que se define localmente en la computadora remota. De lo contrario, PowerShell no sabría cuál es el $Path La variable sería mientras se encuentra en el contexto de la sesión remota.

Una vez que haya realizado los cambios, la función se vería así:

function Remove-FileFolder {
	param(
		[Parameter(Mandatory)]
		[string]$Path,
		
		[Parameter(Mandatory)]
		[System.Management.Automation.Runspaces.PSSession]$Session
	)
	
	Invoke-Command -Session $Session {	Remove-Item -Path $using:Path }
}

¡Ahora tienes una función que ejecutará código en una computadora remota! Y, como estás usando una sesión reutilizable, ¡también puedes definir código y luego hacer referencia a él más tarde!

Written by

Leave a comment