Sessioni Riutilizzabili di PowerShell: Una Guida alle Connessioni Remote Persistenti

Gestire sistemi remoti può rapidamente diventare un incubo, specialmente quando si eseguono comandi multipli su macchine diverse. Il costante andirivieni di riconnessione ai sistemi può essere una perdita di tempo e rallentare il flusso di lavoro. Ti suona familiare? Non preoccuparti, c’è un modo migliore!

In questa guida, imparerai a utilizzare sessioni di remoting di PowerShell riutilizzabili per rendere la gestione dei sistemi remoti più veloce, più facile e più efficiente.

Pronto per migliorare le tue abilità di remoting di PowerShell? Cominciamo!

Creazione e Utilizzo di una Sessione

Quando si lavora con sistemi remoti, uno dei compiti più noiosi può essere riconnettersi ad essi ogni volta che si esegue un comando. In tali casi, entrano in gioco le sessioni riutilizzabili.

Creare una sessione persistente mantiene una connessione continua. In questo modo si elimina la necessità di connettersi e disconnettersi mentre si eseguono ripetutamente comandi multipli.

Per iniziare, dovrai creare una sessione riutilizzabile.

Il cmdlet New-PSSession stabilisce una connessione persistente al computer remoto:

$session = New-PSSession -ComputerName SRV2

Questo oggetto sessione può essere passato a comandi come Invoke-Command, consentendoti di riutilizzare la stessa sessione in tutto lo script.

Per esempio, puoi testare la connessione eseguendo un comando di base:

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

Una sessione riutilizzabile ti consente anche di memorizzare e recuperare variabili sul sistema remoto:

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

Questa capacità di memorizzazione persistente è un vantaggio significativo delle sessioni riutilizzabili, che ti permette di mantenere lo stato attraverso comandi multipli.

Adattare la Funzione per l’Uso Remoto

Adattiamo la funzione di inventario per funzionare con sessioni riutilizzabili.

Innanzitutto, aggiungiamo un parametro Session per accettare un oggetto sessione, dove il cmdlet Get-Member aiuta a identificare il tipo di oggetto sessione:

$session | Get-Member

Dopo aver identificato che l’oggetto sessione è del tipo System.Management.Automation.Runspaces.PSSession, il passo successivo è definire la funzione Get-WmiObjectValue.

Questa funzione utilizza il parametro sessione per abilitare l’esecuzione remota, consentendo di eseguire un blocco di script sul sistema remoto e recuperare una specifica proprietà WMI.

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
}

Proviamo questa funzione e vediamo cosa succede.

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

Prima o poi ti imbatterai in questo errore. Ma non preoccuparti. Continua a leggere e imparerai come risolvere questo errore.

Risolvere i Problemi di Autenticazione

Se incontri errori “Accesso Negato”, è probabile che sia dovuto a autorizzazioni insufficienti. Per impostazione predefinita, le sessioni riutilizzabili ereditano le credenziali usate per crearle.

Controlla il nome utente attualmente autenticato sul sistema:

whoami

Se l’utente di dominio, chiamato utente, non ha il permesso di interrogare WMI sul computer remoto, eleva l’Invoke-Command per utilizzare un account amministrativo.

Innanzitutto, crea un oggetto credenziali con il cmdlet Get-Credential per specificare credenziali alternative durante la creazione della sessione:

$adminCred = Get-Credential -UserName adam

Una volta autenticato, testa la sessione:

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

Questo test garantisce che la sessione funzioni come previsto prima di eseguire la tua funzione di inventario.

Ma se la sessione non ha funzionato, è stata già creata con credenziali errate. In tal caso, è necessario rimuovere la sessione corrente:

Remove-PSSession -Session $session

Il cmdlet Remove-PSSession rimuove la sessione sia sui computer locali che remoti.

Con la vecchia sessione rimossa, crea un’altra nuova sessione. Ma questa volta, crea la sessione autenticandoti come utente admin:

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

Prova di nuovo il Invoke-Command utilizzando la nuova sessione e vedi cosa succede.

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

Ora che sei sicuro che la nuova sessione funziona, proviamo di nuovo la funzione.

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

Mettiamo tutto insieme

Il lavoro duro è finito, ed è tempo di combinare tutto in un unico script.

Questo script finale raccoglie informazioni sull’inventario, visualizza i risultati e pulisce la sessione:

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

Salva e esegui lo script (Get-InventoryInfo.ps1) per verificare che funzioni come previsto.

Conclusione

In questo tutorial, hai imparato a costruire una funzione robusta che utilizza sessioni riutilizzabili per gestire in modo efficace i computer remoti. Ora sai come mantenere una connessione persistente attraverso più comandi ed eseguire compiti complessi su sistemi remoti senza disconnetterti ogni volta.

Andando avanti, puoi ampliare questa conoscenza incorporando sessioni riutilizzabili in flussi di lavoro di automazione più ampi. Un esempio potrebbe essere espandere la funzione di inventario per raccogliere metriche di sistema aggiuntive o automatizzare compiti di manutenzione su più macchine remote.

Combina sessioni riutilizzabili con altre funzionalità di PowerShell. Ottimizza i tuoi sforzi di gestione e automazione IT per risparmiare tempo e ridurre l’intervento manuale.

Source:
https://adamtheautomator.com/powershell-reusable-sessions/