Pide tu presupuesto ya!

Una guía para conexiones remotas persistentes

Administrar sistemas remotos puede convertirse rápidamente en un dolor de cabeza, especialmente cuando se ejecutan múltiples comandos en diferentes máquinas. El constante ir y venir de la reconexión a los sistemas puede hacer perder tiempo y ralentizar su flujo de trabajo. ¿Te suena familiar? ¡No te preocupes, hay una manera mejor!

En esta guía, aprenderá a utilizar sesiones remotas reutilizables de PowerShell para hacer que la administración de sistemas remotos sea más rápida, fácil y eficiente.

¿Listo para mejorar tus habilidades de comunicación remota de PowerShell? ¡Vamos a sumergirnos!

Crear y usar una sesión

Cuando se trabaja con sistemas remotos, una de las tareas más tediosas puede ser volver a conectarse a ellos cada vez que ejecuta un comando. En tales casos, entran en juego las sesiones reutilizables.

La creación de una sesión persistente mantiene una conexión continua. Al hacerlo, se elimina la necesidad de conectarse y desconectarse mientras ejecuta varios comandos repetidamente.

Para comenzar, deberá crear una sesión reutilizable.

El New-PSSession El cmdlet establece una conexión persistente con la computadora remota:

$session = New-PSSession -ComputerName SRV2

Este objeto de sesión se puede pasar a comandos como Invoke-Commandpermitiéndole reutilizar la misma sesión en todo su script.

Por ejemplo, puedes probar la conexión ejecutando un comando básico:

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

Una sesión reutilizable también le permite almacenar y recuperar variables en el sistema remoto:

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

Esta capacidad de almacenamiento persistente es una ventaja significativa de las sesiones reutilizables, ya que le permite mantener el estado en varios comandos.

Adaptación de la función para uso remoto

Adaptemos la función de inventario para que funcione con sesiones reutilizables.

Primero, agregamos un Session parámetro para aceptar un objeto de sesión, donde el Get-Member El cmdlet ayuda a identificar el tipo de objeto de sesión:

$session | Get-Member

Después de identificar que el objeto de sesión es de tipo System.Management.Automation.Runspaces.PSSessionel siguiente paso es definir el Get-WmiObjectValue función.

Esta función utiliza el parámetro de sesión para habilitar la ejecución remota, lo que le permite ejecutar un bloque de script en el sistema remoto y recuperar una propiedad WMI específica.

function Get-WmiObjectValue {
    [CmdletBinding()]
    param(
        # Specify the name of the WMI property to query
        [Parameter(Mandatory)]
        [string]$PropertyName,

        # Specify the name of the WMI class to query
        [Parameter(Mandatory)]
        [string]$WmiClassName,

        # Specify the remote session object to use for invoking the command
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    # Define the script block to execute on the remote machine
    $scriptBlock = {
        # Get the sum of the specified property from the WMI class
        $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum

        # Convert the sum to gigabytes
        $numberGb = $number / 1GB

        # Round the result to 2 decimal places
        [math]::Round($numberGb, 2)
    }

    # Execute the script block on the remote machine using the provided session
    Invoke-Command -Session $Session -Scriptblock $scriptBlock
}

Probemos esta función y veamos qué sucede.

Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session

Te encontrarás con este error en algún momento. Pero no te preocupes. Continúe leyendo y aprenderá cómo solucionar este error.

Abordar problemas de autenticación

Si encuentra errores de “Acceso denegado”, probablemente se deba a permisos insuficientes. De forma predeterminada, las sesiones reutilizables heredan las credenciales utilizadas para crearlas.

Verifique el nombre de usuario del usuario actualmente autenticado en el sistema:

whoami

Si el usuario del dominio, llamado usuario, no tiene permiso para consultar WMI en la computadora remota, eleve el Invoke-Command para utilizar una cuenta de administrador.

Primero, cree un objeto de credencial con el Get-Credential cmdlet para especificar credenciales alternativas al crear la sesión:

$adminCred = Get-Credential -UserName adam

Una vez autenticado, pruebe la sesión:

Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred

Esta prueba garantiza que la sesión funcione como se esperaba antes de ejecutar la función de inventario.

Pero si la sesión no funcionó, ya se creó con credenciales incorrectas. Si es así, debes eliminar la sesión actual:

Remove-PSSession -Session $session

El Remove-PSSession El cmdlet elimina la sesión tanto en la computadora local como en la remota.

Una vez eliminada la sesión anterior, cree otra sesión nueva. Pero esta vez, crea la sesión autenticada como usuario administrador:

$session = New-PSSession -ComputerName SRV2 -Credential $adminCred

Prueba el Invoke-Command nuevamente usando la nueva sesión y vea qué sucede.

Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred

Ahora que está seguro de que la nueva sesión funciona, intentemos la función nuevamente.

Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session

Reuniéndolo todo

Se acabó el trabajo duro y es hora de combinar todo en un solo guión.

Este script final recopila información de inventario, muestra los resultados y limpia la sesión:

function Get-WmiObjectValue {
    [CmdletBinding()]
    param(
        # Specify the name of the WMI property to query
        [Parameter(Mandatory)]
        [string]$PropertyName,

        # Specify the name of the WMI class to query
        [Parameter(Mandatory)]
        [string]$WmiClassName,

        # Specify the remote session object to use for invoking the command
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    # Define the script block to execute on the remote machine
    $scriptBlock = {
        # Get the sum of the specified property from the WMI class
        $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum

        # Convert the sum to gigabytes
        $numberGb = $number / 1GB

        # Round the result to 2 decimal places
        [math]::Round($numberGb, 2)
    }

    # Execute the script block on the remote machine using the provided session
    Invoke-Command -Session $Session -Scriptblock $scriptBlock
}

## Grab the alternate credential: Get-CimInstance will work on the remote computer
$adminCred = Get-Credential -UserName adam

## Create a session authenticating as the adam (admin) user
$session = New-PSSession -ComputerName SRV2 -Credential $adminCred

## Find the total memory and total volume storage space on the remote computer
$totalMemoryGb = Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
$totalStorageGb = Get-WmiObjectValue -PropertyName FreeSpace -WmiClassName Win32_LogicalDisk -Session $session

Write-Host "The computer $($session.ComputerName) has $totalMemoryGb GB of memory and $totalStorageGb GB of free space across all volumes."

## Remove the shared session
Remove-PSSession -Session $session

Guarde y ejecute el script (Obtener-InventoryInfo.ps1) para verificar que funciona según lo previsto.

Conclusión

En este tutorial, aprendió a crear una función sólida que utiliza sesiones reutilizables para administrar computadoras remotas de manera efectiva. Ahora sabe cómo mantener una conexión persistente a través de múltiples comandos y ejecutar tareas complejas en sistemas remotos sin desconectarse cada vez.

En el futuro, puede aprovechar este conocimiento incorporando sesiones reutilizables en flujos de trabajo de automatización más amplios. Un ejemplo sería ampliar la función de inventario para recopilar métricas adicionales del sistema o automatizar tareas de mantenimiento en varias máquinas remotas.

Combine sesiones reutilizables con otras funciones de PowerShell. Optimice sus esfuerzos de automatización y gestión de TI para ahorrar tiempo y reducir la intervención manual.

Written by

Leave a comment