PowerShell Herbruikbare Sessies: Een Gids voor Blijvende Externe Verbindingen

Het beheren van externe systemen kan snel een hoofdpijn worden, vooral wanneer u meerdere opdrachten uitvoert over verschillende machines. Het constante heen en weer verbinding maken met systemen kan tijd verspillen en uw workflow vertragen. Komt dit bekend voor? Maak je geen zorgen, er is een betere manier!

In deze handleiding leer je hoe je herbruikbare PowerShell-verbindingssessies kunt gebruiken om het beheren van externe systemen sneller, gemakkelijker en efficiënter te maken.

Klaar om je PowerShell-verbindingstechnieken naar een hoger niveau te tillen? Laten we beginnen!

Creëren en Gebruiken van een Sessie

Wanneer je werkt met externe systemen, kan een van de meest vervelende taken het steeds opnieuw verbinden met hen zijn telkens wanneer je een opdracht uitvoert. In dergelijke gevallen komen herbruikbare sessies van pas.

Het creëren van een persistente sessie handhaaft een continue verbinding. Hierdoor wordt de noodzaak om telkens opnieuw verbinding te maken en te verbreken geëlimineerd terwijl je meerdere opdrachten herhaaldelijk uitvoert.

Om te beginnen, moet je een herbruikbare sessie creëren.

De cmdlet New-PSSession legt een blijvende verbinding met de externe computer:

$session = New-PSSession -ComputerName SRV2

Deze sessieobject kan worden doorgegeven aan opdrachten zoals Invoke-Command, waardoor je dezelfde sessie door je script heen opnieuw kunt gebruiken.

Je kunt bijvoorbeeld de verbinding testen door een basisopdracht uit te voeren:

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

Een herbruikbare sessie stelt je ook in staat om variabelen op te slaan en op te halen op het externe systeem:

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

Deze persistente opslagmogelijkheid is een belangrijk voordeel van herbruikbare sessies, waardoor je de status kunt behouden over meerdere opdrachten.

Het Aanpassen van de Functie voor Extern Gebruik

Laten we de inventarisfunctie aanpassen om te werken met herbruikbare sessies.

Eerst voegen we een Session parameter toe om een sessieobject te accepteren, waarbij de Get-Member cmdlet helpt om het type sessieobject te identificeren:

$session | Get-Member

Na het identificeren dat het sessieobject van het type System.Management.Automation.Runspaces.PSSession is, is de volgende stap het definiëren van de Get-WmiObjectValue functie.

Deze functie gebruikt de sessieparameter om externe uitvoering mogelijk te maken, zodat het een scriptblok op het externe systeem kan uitvoeren en een specifieke WMI-eigenschap kan ophalen.

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
}

Laten we deze functie uitproberen en kijken wat er gebeurt.

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

Je zult op een bepaald moment tegen deze fout aanlopen. Maar maak je geen zorgen. Lees verder, en je leert hoe je deze fout kunt oplossen.

Omgaan met authenticatieproblemen

Als je “Toegang geweigerd” fouten tegenkomt, is het waarschijnlijk vanwege onvoldoende rechten. Standaard erven herbruikbare sessies de referenties die zijn gebruikt om ze te creëren.

Controleer de gebruikersnaam van de momenteel geauthenticeerde gebruiker op het systeem:

whoami

Als de domeingebruiker, genaamd gebruiker, geen toestemming heeft om WMI op de externe computer te ondervragen, verhoog dan de Invoke-Command om een beheerdersaccount te gebruiken.

Eerst maak je een referentieobject met de Get-Credential cmdlet om alternatieve referenties op te geven bij het maken van de sessie:

$adminCred = Get-Credential -UserName adam

Als je eenmaal bent geauthenticeerd, test je de sessie:

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

Deze test zorgt ervoor dat de sessie werkt zoals verwacht voordat je je inventarisfunctie uitvoert.

Maar als de sessie niet werkte, was deze al gemaakt met onjuiste referenties. Als dat het geval is, moet je de huidige sessie verwijderen:

Remove-PSSession -Session $session

De Remove-PSSession-cmdlet verwijdert de sessie zowel op de lokale als op de externe computers.

Met de oude sessie verwijderd, maak je een nieuwe sessie aan. Maar deze keer maak je de sessie geauthenticeerd als de beheerder:

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

Probeer de Invoke-Command opnieuw te gebruiken met de nieuwe sessie en kijk wat er gebeurt.

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

Nu je er zeker van bent dat de nieuwe sessie werkt, laten we de functie opnieuw proberen.

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

Alles samenvoegen

Het zware werk is voorbij en het is tijd om alles te combineren in één script.

Dit definitieve script verzamelt inventarisatiegegevens, toont de resultaten en ruimt de sessie op:

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

Sla op en voer het script uit (Get-InventoryInfo.ps1) om te controleren of het werkt zoals bedoeld.

Conclusie

In deze tutorial heb je geleerd hoe je een robuuste functie bouwt die herbruikbare sessies gebruikt om externe computers effectief te beheren. Je weet nu hoe je een blijvende verbinding kunt behouden over meerdere commando’s en complexe taken kunt uitvoeren op externe systemen zonder telkens te ontkoppelen.

Vooruitkijkend kun je voortbouwen op deze kennis door herbruikbare sessies op te nemen in grotere automatiseringsworkflows. Een voorbeeld zou zijn om de inventarisatiefunctie uit te breiden om aanvullende systeemmetingen te verzamelen of onderhoudstaken te automatiseren op meerdere externe machines.

Combineer herbruikbare sessies met andere PowerShell-functies. Stroomlijn uw IT-beheer en automatiseringsinspanningen om tijd te besparen en handmatige interventie te verminderen.

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