Die Verwaltung von Remote-Systemen kann schnell zu einem Kopfzerbrechen werden, insbesondere wenn mehrere Befehle auf verschiedenen Maschinen ausgeführt werden. Das ständige Hin und Her beim Wiederverbinden mit Systemen kann Zeit verschwenden und Ihren Arbeitsablauf verlangsamen. Kommt Ihnen das bekannt vor? Keine Sorge, es gibt einen besseren Weg!
In diesem Leitfaden lernen Sie, wiederverwendbare PowerShell-Remoting-Sitzungen zu nutzen, um die Verwaltung von Remote-Systemen schneller, einfacher und effizienter zu gestalten.
Bereit, Ihre PowerShell-Remoting-Fähigkeiten auf das nächste Level zu heben? Lassen Sie uns eintauchen!
Sitzung erstellen und verwenden
Bei der Arbeit mit Remote-Systemen kann eine der mühsamsten Aufgaben das ständige Wiederverbinden sein, jedes Mal, wenn Sie einen Befehl ausführen. In solchen Fällen kommen wiederverwendbare Sitzungen ins Spiel.
Das Erstellen einer persistenten Sitzung hält eine kontinuierliche Verbindung aufrecht. Dadurch entfällt die Notwendigkeit, sich wiederholt zu verbinden und zu trennen, während Sie mehrere Befehle ausführen.
Um zu beginnen, müssen Sie eine wiederverwendbare Sitzung erstellen.
Das New-PSSession
-Cmdlet stellt eine dauerhafte Verbindung zum Remote-Computer her:
$session = New-PSSession -ComputerName SRV2
Dieses Sitzungsobjekt kann an Befehle wie Invoke-Command
übergeben werden, sodass Sie dieselbe Sitzung während Ihres Skripts wiederverwenden können.
Zum Beispiel können Sie die Verbindung testen, indem Sie einen grundlegenden Befehl ausführen:
Invoke-Command -Session $session -ScriptBlock { hostname }
Eine wiederverwendbare Sitzung ermöglicht es Ihnen auch, Variablen auf dem Remote-System zu speichern und abzurufen:
Invoke-Command -Session $session -ScriptBlock { $foo = 'Please be here next time' } Invoke-Command -Session $session -ScriptBlock { $foo }
Diese Fähigkeit zur persistenten Speicherung ist ein erheblicher Vorteil von wiederverwendbaren Sitzungen und ermöglicht es Ihnen, den Zustand über mehrere Befehle hinweg aufrechtzuerhalten.
Die Funktion für die Remote-Nutzung anpassen
Lassen Sie uns die Inventarfunktion anpassen, um mit wiederverwendbaren Sitzungen zu arbeiten.
Zuerst fügen wir einen Session
-Parameter hinzu, um ein Sitzungsobjekt zu akzeptieren, wobei das Get-Member
-Cmdlet hilft, den Typ des Sitzungsobjekts zu identifizieren:
$session | Get-Member
Nachdem wir festgestellt haben, dass das Sitzungsobjekt vom Typ System.Management.Automation.Runspaces.PSSession
ist, besteht der nächste Schritt darin, die Get-WmiObjectValue
-Funktion zu definieren.
Diese Funktion verwendet den Sitzungsparameter, um die Remote-Ausführung zu ermöglichen, sodass sie einen Skriptblock auf dem Remote-System ausführen und eine bestimmte WMI-Eigenschaft abrufen kann.
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 }
Versuchen wir, diese Funktion auszuprobieren, und sehen wir, was passiert.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
Sie werden irgendwann auf diesen Fehler stoßen. Aber keine Sorge. Lesen Sie weiter, und Sie werden lernen, wie Sie diesen Fehler beheben können.
Behebung von Authentifizierungsproblemen
Wenn Sie auf „Zugriff verweigert“-Fehler stoßen, liegt dies wahrscheinlich an unzureichenden Berechtigungen. Standardmäßig erben wiederverwendbare Sitzungen die Anmeldeinformationen, die zu ihrer Erstellung verwendet wurden.
Überprüfen Sie den aktuell authentifizierten Benutzernamen auf dem System:
whoami
Wenn der Domänenbenutzer, genannt Benutzer, keine Berechtigung hat, WMI auf dem Remote-Computer abzufragen, heben Sie das Invoke-Command
an, um ein Administratorkonto zu verwenden.
Zuerst erstellen Sie ein Anmeldeinformationsobjekt mit dem Get-Credential
-Cmdlet, um alternative Anmeldeinformationen bei der Erstellung der Sitzung anzugeben:
$adminCred = Get-Credential -UserName adam
Sobald Sie authentifiziert sind, testen Sie die Sitzung:
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
Dieser Test stellt sicher, dass die Sitzung wie erwartet funktioniert, bevor Sie Ihre Inventarfunktion ausführen.
Aber wenn die Sitzung nicht funktioniert hat, wurde sie bereits mit falschen Anmeldeinformationen erstellt. In diesem Fall müssen Sie die aktuelle Sitzung entfernen:
Remove-PSSession -Session $session
Das Remove-PSSession
Cmdlet entfernt die Sitzung sowohl auf den lokalen als auch auf den entfernten Computern.
Nachdem die alte Sitzung entfernt wurde, erstellen Sie eine neue Sitzung. Aber diesmal erstellen Sie die Sitzung, die als Admin-Benutzer authentifiziert ist:
$session = New-PSSession -ComputerName SRV2 -Credential $adminCred
Versuchen Sie erneut das Invoke-Command
mit der neuen Sitzung und sehen Sie, was passiert.
Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred
Jetzt, wo Sie sicher sind, dass die neue Sitzung funktioniert, lassen Sie uns die Funktion erneut ausprobieren.
Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
Alles zusammenbringen
Die harte Arbeit ist vorbei, und es ist Zeit, alles in ein Skript zu kombinieren.
Dieses finale Skript sammelt Bestandsinformationen, zeigt die Ergebnisse an und bereinigt die Sitzung:
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
Speichern Sie und führen Sie das Skript aus (Get-InventoryInfo.ps1), um zu überprüfen, ob es wie beabsichtigt funktioniert.
Fazit
In diesem Tutorial haben Sie gelernt, eine robuste Funktion zu erstellen, die wiederverwendbare Sitzungen verwendet, um entfernte Computer effektiv zu verwalten. Sie wissen jetzt, wie man eine dauerhafte Verbindung über mehrere Befehle aufrechterhält und komplexe Aufgaben auf entfernten Systemen ausführt, ohne sich jedes Mal trennen zu müssen.
In Zukunft können Sie dieses Wissen nutzen, um wiederverwendbare Sitzungen in größere Automatisierungs-Workflows zu integrieren. Ein Beispiel wäre, die Bestandsfunktion zu erweitern, um zusätzliche Systemmetriken zu sammeln oder Wartungsaufgaben auf mehreren entfernten Maschinen zu automatisieren.
Kombinieren Sie wiederverwendbare Sitzungen mit anderen PowerShell-Funktionen. Optimieren Sie Ihr IT-Management und Ihre Automatisierungsbemühungen, um Zeit zu sparen und manuelle Eingriffe zu reduzieren.
Source:
https://adamtheautomator.com/powershell-reusable-sessions/