Cmdlet-Tuning - PowerShell-Erweiterungen

Lesezeit
9 Minuten
Bis jetzt gelesen

Cmdlet-Tuning - PowerShell-Erweiterungen

01.06.2026 - 17:07
Veröffentlicht in:

Die PowerShell ist nicht nur ein flexibles Werkzeug zur Systemverwaltung und -automatisierung, auch das Framework selbst ist umfassend anpassbar. Dazu finden sich in der PowerShell Gallery zahlreiche Module, Erweiterungen und Plug-ins. Wir stellen beispielhaft Module für TeamViewer, Windows-Updates und optische Erweiterungen vor, die in der Praxis sehr hilfreich sind.

Microsoft setzt seit der Vorstellung des Paketmanagers NuGet konsequent darauf, den Zugang zu Drittanbieter-Bibliotheken zu erleichtern. Diese in der klassischen .NET-Entwicklung seit langer Zeit etablierte Vorgehensweise steht mittlerweile in der PowerShell zur Verfügung. Als Interface dient dabei die PowerShell Gallery. Auf deren Unterseite zu Packages finden Sie besonders häufig heruntergeladene PowerShell-Erweiterungen.


In der Praxis ist diese Liste allerdings nicht unbedingt aussagekräftig, denn Microsoft verteilt seit einiger Zeit auch diverse Azure-Cloud-Service-SDKs über diesen Dienst, weshalb die Downloadzahlen mitunter etwas verschoben sind. Dennoch finden sich dort interessante Erweiterungen, die wir im Folgenden vorstellen.

Microsoft dokumentiert daneben die für die Verwaltung, Beschaffung und Versionierung von PowerShell-Erweiterungen vorgesehenen Cmdlets detailliert. Hier finden Sie einen guten Einstieg in die Thematik.

Bild 1: In der PowerShell Gallery sammelt Microsoft zentral alle Drittanbieter-Erweiterungen für die PowerShell.
Bild 1: In der PowerShell Gallery sammelt Microsoft zentral alle Drittanbieter-Erweiterungen für die PowerShell.

Achtung vor veralteten Modulen

Zu beachten ist, dass Microsoft die hochgeladenen Module nur auf das Vorhandensein von Schadcode prüft. Auch in der Topliste finden sich immer wieder Module, die veraltet sind. So zum Beispiel "PendingReboot", das auf heute kaum noch unterstützte WMI-Commandlets setzt. Zur Identifikation derartiger Produkte ist es empfehlenswert, die (normalerweise auf GitHub gehostete) Webseite des jeweiligen Entwicklers zu besuchen und dort im Issues-Tab nach "markanten" Problemen zu suchen. Auf diese Art und Weise ersparen Sie sich viel Ausprobieren.

Die Meldung gefundener Fehler und Probleme erfolgt dabei im Allgemeinen ebenfalls über GitHub beziehungsweise den im Versionskontrollsystem integrierten Issue Tracker. Zu seiner Nutzung ist das Git-Kommandozeilenwerkzeug übrigens nicht notwendig, denn die Verwaltung von Bug-Feature-Wunsch und Co. erfolgt ausschließlich über das Webinterface.

Modul für TeamViewer

Das Unternehmen TeamViewer ist vor allem für seine gleichnamige Fernwartungssoftware bekannt. Mit TeamViewerPS steht ein Wrapper zur Verfügung, der PowerShell-Skripten die komfortable Interaktion mit der Remote-Zugriffssoftware ermöglicht. Zur Installation sind Administratorrechte in der PowerShell erforderlich, in der Sie den Befehl Install-Module TeamViewerPS  eingeben. Mitunter erscheint dann die Fehlermeldung "Nicht vertrauenswürdiges Repository", die Sie bedenkenlos durch Drücken von "A" und "Enter" abnicken können.

Nach dem erfolgreichen Herunterladen können Sie über Get-TeamViewerId  die TeamViewer-ID des Systems ermitteln, auf dem das Skript läuft. Da unbeaufsichtigt aktive, lokale TeamViewer-Instanzen aus Sicherheitsgründen nicht wünschenswert sind, stehen Cmdlets zum Starten

Start-TeamViewerService 

und Stoppen des Diensts zur Verfügung

Stop-TeamViewerService 

Zu beachten ist, dass das Anhalten eine aktuell laufende Instanz der TeamViewer-GUI beendet, die sich durch den Aufruf von Start-TeamViewerService  allerdings nicht wieder starten lässt.

Im Unternehmensbetrieb wird TeamViewer so gut wie immer über seine Cloudkomponente deployed. Auch diese ist über TeamViewerPS orchestrierbar. Im ersten Schritt ist es hierzu erforderlich, durch Eingabe des folgenden Befehls den Prozess zum Einpflegen der Login-Credentials zu aktivieren:

Connect-TeamViewerApi 

Jetzt erhalten Sie eine Eingabeaufforderung, die sich nach dem Eingeben der notwendigen Daten um die Herstellung der Verbindung kümmert. Nach dem Erfüllen dieser Bedingung kann Ihr Skript mehr oder weniger beliebige Operationen gegen den in der Cloud lebenden Datenbestand durchführen. Weitere Informationen hierzu finden sich in der hier bereitstehenden Dokumentation.

Verwalten von Windows-Updates

PSWindowsUpdate ist eines der meistverwendeten Module der PowerShell Gallery. Seine Aufgabe ist die Administration des Aktualisierungsstands von Rechnern. Sie laden es über

Install-Module -Name PSWindowsUpdate 

auf Ihr System und Get-WindowsUpdate  liefert dabei ,wie Bild 2 zu sehen, eine Liste der zur Installation bereitstehenden Updates zurück. Zu beachten ist, dass die Abarbeitung des Befehls selbst auf dem vergleichsweise schnellen Rechner merklich Zeit in Anspruch nimmt.

Bild 2: Auf unserem Testrechner fehlen laut dem PSWindowsUpdate-Modul nur unkritische Updates.
Bild 2: Auf unserem Testrechner fehlen laut dem PSWindowsUpdate-Modul nur unkritische Updates.

Das Übergeben des Parameters "-Category" erlaubt das Einschränken der angebotenen Updates. Möchten Sie beispielsweise nur nach sicherheitsrelevanten Aktualisierungen suchen, nutzen Sie

Get-WindowsUpdate -Category 'SecurityUpdates' 

Durch das Pipen des Befehls an das Install-WindowsUpdate-Cmdlet lassen sich die Aktualisierungen sogleich auf die Workstation ausrollen:

Get-WindowsUpdate -Category 'SecurityUpdates' | Install-WindowsUpdate 

Die gezielte Installation bestimmter Win-dows-Updates lässt sich ähnlich durchführen, wenn Sie die KB-ID kennen. So erschien während des Schreibens dieses Artikels das Windows-Defender-Update mit der KB-ID "KB2267602". Somit ist ein Definitionsupdate für den Virenscanner mit dem nach folgendem Schema aufgebauten Befehl durchführbar:

Install-WindowsUpdate -KBArticleID KB2267602 -AcceptAll -AutoReboot 

Unerwünschte Updates schließen Sie über das PSWindowsUpdate-Cmdlet von der Installation aus. Im Beispiel des Defender-Updates lautet der vorgesehene Befehl folgendermaßen (durch das Weglassen von "-AcceptAll" erscheint während seiner Ausführung eine Sicherheitsabfrage):

Hide-WindowsUpdate -KBArticleID KB2267602 

Der Parameter "-AcceptAll" eliminiert die normalerweise eingeblendeten Sicherheitsabfragen, während "-AutoReboot" einen (hier nicht erforderlichen) automatisierten Reboot der Workstation nach dem erfolgreichen Deployment des Updates autorisiert.

Das Cmdlet liefert außerdem detaillierte Informationen über den gesamten Aktualisierungszustand. Über den Befehl Get-WURebootStatus  teilen Sie Ihrem Skript mit, ob aufgrund eines wartenden Windows-Updates ein Reboot der Workstation erfolgen soll. Das Kommando Get-WUHistory  liefert eine komplette Liste aller Aktualisierungen des Systems. Wundern Sie sich aber nicht, wenn die Bearbeitung des Befehls selbst auf einer sehr leistungsfähigen Workstation mehr als eine Minute in Anspruch nimmt.

BIOS-Informationen auslesen

Obwohl die Zeit der reißerischen Fachartikel mit BIOS-Hacks der Vergangenheit angehört, gilt, dass BIOS-Einstellungen sowie eine Übersicht der Konfiguration des Host-Systems hilfreich sind. Die durch Install-Module -Name GetBIOS  installierbare Get-BIOS-Erweiterung der PowerShell bietet einen Weg zu diesen Informationen an. Auf unterstützter Hardware (Dell, HP und Lenovo) liefert das Werkzeug ein Objekt-Array mit allen BIOS-Einstellungen zurück, die es finden konnte. Schade ist nur, dass das Modul andere Hersteller ablehnt.

YAML in der PowerShell nutzen

Das Zurückliefern von Objekt-Arrays ermöglicht PowerShell-Cmdlets das Bereitstellen umfangreicher Informationen. Das entgegennehmende Skript kann diese dann analog zu einem klassischen Objekt "aufbrechen", um mit geringem Programmieraufwand an die gewünschten Elemente beziehungsweise Informationen zu kommen.

Problematisch ist dabei, dass sich derartige Objekt-Arrays nur schwer serialisieren lassen. Möchten Sie die Ergebnisse eines PowerShell-Skripts an einen Server oder gar ein IoT-Gerät senden, dann ist eine andere Austauschsprache empfehlenswert.

Während JSON und XML gut etabliert sind, hat YAML im Laufe der letzten Jahre viel Aufmerksamkeit gewonnen. Über Install-Module -Name powershell-yaml  erhalten Sie eine Erweiterung, die PowerShell-Skripten die Interaktion mit YAML ermöglicht. Die Inbetriebnahme der beiden so zur Verfügung gestellten Commandlets "ConvertTo-Yaml" und "Manque" erfolgt dabei konsequent über die Pipe-Funktion.

Bild 3: Die ConvertTo-Yaml-Erweiterung unterstützt beim Einsatz von YAML.
Bild 3: Die ConvertTo-Yaml-Erweiterung unterstützt beim Einsatz von YAML.

Ein Beispiel dafür ist folgender Befehl, der wie in Bild 3 zu sehen eine serialisierte und übertragungsbereite Variante des vom Cmdlet zurückgelieferten Strings zur Verfügung stellt:

Get-InstalledLanguage | ConvertTo-Yaml 

In der Dokumentation des Moduls findet sich auch folgende Variante, die ein als String angeliefertes YAML-Dokument in ein PowerShell-Objekt konvertiert:

$yaml = @" 
anArray: 
- 1 
- 2 
- 3 
nested: 
  array: 
  - this 
  - is 
  - an 
  - array 
hello: world 
"@ 
$obj = ConvertFrom-Yaml $yaml 

Nach der Abarbeitung des Befehls zeigt die Variable "$obj" ein gewöhnliches PowerShell-Objekt. Seine Inhalte lassen sich unter Nutzung der diversen Syntaxelemente extrahieren und weiterverarbeiten.

Cover des IT-Adminstrator-Sonderhefts 01/2024 "PowerShell"

Dieser Artikel erschien im IT-Administrator Sonderheft I/2024

"PowerShell – Infrastrukturen automatisiert verwalten"

Das Sonderheft I/2024  liefert auf 205 Seiten praktisches Know-how zum Umgang mit der Microsoft-Skriptumgebung und deren Einsatz zur Automatisierung wichtiger Serversysteme. Das Autorenteam wirft unter anderem einen Blick auf die Methoden und Techniken, die die PowerShell für die Administration bereitstellt.

Bestellen Sie das Sonderheft hier als E-Paper
oder
hier als gedrucktes Heft.

Diagramme und Audiodaten verarbeiten

Aufgrund des engen Zusammenhangs zwischen der Azure-Verwaltung und der PowerShell ist das Erzeugen von Diagrammen eine häufige Aufgabe. In der Theorie könnten Sie an dieser Stelle auf WPF (Windows Presentation Foundation) zurückgreifen, doch in der Praxis sind semigrafische Systeme oft der bequemere Weg. Geht es um die Erzeugung einfacher Linien oder Balkendiagramme, schlägt die Stunde des Moduls "Graphical".

Da sein Entwicklerteam eine Demo- applikation bereitstellt, wollen wir zu seiner Vorführung das dazugehörende Audio-Interaktionsmodul herunterladen. In einer wie gewohnt mit Administratorrechten ausgestatteten PowerShell sind dazu die folgenden beiden Befehle erforderlich:

Install-Module -Name Graphical 
Install-Module -Name AudioDeviceCmdlets 

AudioDeviceCmdlets ist ein Werkzeug zur Verarbeitung der am Rechner befindlichen Audio-Peripherie. Durch die Eingabe von Get-AudioDevice -List  lässt sich das Programm beispielsweise zur Anzeige einer Liste aller gerade aktivierten Audiogeräte animieren.

Ebenso finden sich im Modul verschiedene andere Funktionen, beispielsweise zum Festlegen der Eigenschaften bestimmter Audiogeräte. Hilfreich könnte beispielsweise der Aufruf

Set-AudioDevice -ID <ID des Device> -CommunicationOnly  

sein, über den sich das in Windows oft nicht ganz einfache Festlegen eines bestimmten Audiogeräts als Kommunikationsinterface automatisieren lässt. Standardkonform programmierte Messenger nutzen dieses danach als Interface zur Tonausgabe.

Für ein erweitertes Beispiel legen Sie zunächst eine neue PS1-Arbeitsdatei an. In ihr kommt der Code aus Listing 1 unter. Das Beispielskript beginnt mit dem Erzeugen einer Repräsentationsklasse, die auf ein Audiogerät hinweist. Durch das Übergeben des Parameters "-Playback" an die Methode "AudioDevice" weisen wir die Bibliothek darauf hin, dass wir Zugriff auf den Ausgabedatenstrom des Computers erbitten. Dies ist insofern hilfreich, alsdass Sie so direkt auf die in Richtung Kopfhörer oder Lautsprecher gesendeten Informationen zugreifen können.

Listing 1: Audiogeräte steuern

Import-Module AudioDeviceCmdlets, Graphical -Verbose
$Device = Get-AudioDevice -Playback
[int[]]$datapoints =@(0)*50
do {
    $PeakValue = $Device.Device.AudioMeterIn formation.MasterPeakValue*100
    $datapoints += [int]$PeakValue
    $datapoints = $datapoints | Select-Object -last 50
    Clear-Host
    Show-Graph -datapoints $datapoints  -GraphTitle AudioLevels
    Show-Graph -datapoints $datapoints  -GraphTitle AudioLevels -Type Line
    Show-Graph -datapoints $datapoints  -GraphTitle AudioLevels -Type Scatter
    Start-Sleep -Milliseconds 1000
} while ($true)

Der nächste Akt ist das Starten einer Endlosschleife, die im ersten Schritt Informationen über die maximale Lautstärke des Audiogeräts ermittelt. Danach wird dieser Pegel durch drei Aufrufe der Show-Graph-Methode zur Visualisierung freigegeben. Dabei sorgt "Start-Sleep" dafür, dass die Aktualisierung der Diagramme nicht so schnell vonstatten geht, dass Sie diese nicht nachvollziehen können. Spielen Sie auf Ihrem Rechner nun ein YouTube-Video oder ein MP3-File ab, erhalten Sie danach das in Bild 4 gezeigte Ergebnis.

Bild 4: Graphical-Modul visualisiert die Inhalte der Lautstärkenarrays.
Bild 4: Graphical-Modul visualisiert die Inhalte der Lautstärkenarrays.

Das Übergeben der Parameter "-Type Line" und "-Type Scatter" ermöglicht dabei das Anpassen der Darstellungsweise. Angemerkt sei, dass das Array ein beliebiges Integer-Array ist. Wer beispielsweise das erwähnte Azure-SDK verwendet, kann das Modul auch zur Darstellung von Auslastungsinformationen für aus der Cloud erworbenen Ressourcen einspannen.

Interaktivität und Lesbarkeit verbessern

Viele Menschen haben mit der intuitiven Erfassung von Zahlenkolumnen Probleme. Geht es nur um das Hervorheben bestimmter Zeilen, reicht das Einfärben aus. Dies lässt sich durch das Modul PSWriteColor erreichen, das Sie via

Install-Module -Name PSWriteColor 

einspielen. Anschließend bietet sich ein erster Test nach folgendem Schema an:

Write-Color -Text "Red ", "Green ", "Yellow " -Color Red, Green, Yellow 

Probieren Sie dieses Kommando einmal aus, sehen Sie auf Ihrem Bildschirm direkt, wie die Farben dabei zum Einsatz kommen. Für die Zuordnung zwischen den Farben und den einzelnen in den Terminal-Emulator geschriebenen Strings kommt dabei dieses Verfahren zum Einsatz: Der logisch erste String wird mit der logisch ersten Farbe verbunden. In unserem Fall weist demnach der String "Red" den Farbwert "Red" auf.

Im Bereich der Farbkombinationen ist das Modul vergleichsweise unflexibel und unterstützt nicht den vollen Farbschatz der in .NET enthaltenen Color-Klassen. Stattdessen ist das Modul derzeit auf die folgenden Farbkombinationen beschränkt: Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White

Doch das Modul ist nicht auf das Anpassen der Textfarbe beschränkt. Insbesondere in komplexeren Ausgaben kann es wünschenswert sein, durch die Hintergrundfarbe des Texts eine zusätzliche visuelle Trennung zu realisieren. Dies lässt sich durch Nutzung des Parameters" -B" realisieren, den Sie folgendermaßen einsetzen und dessen Ergebnis Bild 5 zeigt:

Write-Color -Text "Das ist ein Testtext" -Color Red -B DarkBlue 
Bild 5: PSWriteColor färbt bei Bedarf auch den Hintergrund ein.
Bild 5: PSWriteColor färbt bei Bedarf auch den Hintergrund ein.

Eine weitere häufige Aufgabe in der Welt der PowerShell-Skripte ist das Treffen einer Wahl aus vorgefertigten Optionen. Ein praktisches Beispiel dafür wäre ein Skript zur Konfiguration von Prozessrechnern. Dabei kann ein Skript eine Gruppe von Optionen liefern, die die Art des in Arbeit befindlichen Systems beschreiben. Mit "PS-Menu" steht Ihnen ein entsprechendes Werkzeug zur Verfügung, das Sie in einer mit Administratorrechten ausgestatteten PowerShell-Instanz durch Install-Module PS-Menu  einspielen.

Zu seiner Demonstration ist eine weitere PS1-Datei erforderlich, in der Sie zunächst nur "Import-Module PS-Menu" ablegen. Für einen ersten Versuch bietet es sich dann an, nach folgendem Schema eine reduzierte Variante des aus dem TUI-Artikel auf Seite 24 bekannten musikalischen Fenster zu realisieren:

$result = menu @("Fauchen", "Wefzen", "Zenzen") 
Write-Output $result 

Die Konstruktion nach dem Schema "menu @("Fauchen", "Wefzen", "Zenzen")" realisiert dabei das gewünschte Menü, dessen Ergebnisse in der Variable zwischengespeichert werden. Die darin enthaltenen Werte erscheinen dann auf den Bildschirm gebracht, wie in Bild 6 zu sehen.

Bild 6: Von Haus aus liefert das menu-Modul den String-Wert der ausgewählten Menüoption zurück.
Bild 6: Von Haus aus liefert das menu-Modul den String-Wert der ausgewählten Menüoption zurück.

In diesem Zusammenhang sind Vergleiche gegen Strings aus wartungstechnischer Sicht nicht empfehlenswert. Erstens nehmen sie vergleichsweise viel Rechenzeit in Anspruch, zweitens führen Tippfehler dabei zu schwer auffindbaren Fehlern. Ein besserer Weg besteht darin, das Modul zum Zurückliefern des Index der vom Benutzer ausgewählten Option zu animieren.

Die Version des Programms in Listing 2 übergibt den Parameter "-ReturnIndex". Dadurch stellt der Menü-Generator numerische Index-Werte bereit. Die in der Variable enthaltenen Ergebnisse werden durch den Operator "$result -eq 1" mit den jeweiligen Konstanten verglichen. Wichtig ist hier eigentlich nur, dass der logisch erste String "Fauchen" durch den Wert "0" repräsentiert.

Listing 2: Erstellen eines Auswahlmenüs

Import-Module PS-Menu
$result = menu @("Fauchen", "Wefzen", "Zenzen") -ReturnIndex
Write-Output $result
if($result -eq 0) {
    Write-Output "Lasset uns Fauchen"
}
elseif($result -eq 1) {
    Write-Output "Lasset uns Wefzen"
}
elseif($result -eq 2) {
    Write-Output "Lasset uns Zenzen"
}

Bessere Benutzererfahrung durch Plug-ins

Wer seiner Shell einen persönlichen Eindruck zu verschaffen versucht, kann dies in der PowerShell durch den Import verschiedenster Module bewerkstelligen. Als erstes Beispiel wollen wir auf das Modul "Terminal-Icons" blicken. Es erweitert die Ordner-Inhaltsanzeige um kleine Symbole, die die Art des jeweils aufgelisteten Elements beschreiben. Seine Installation erfolgt in einer mit Administratorrechten ausgestatteten PowerShell-Instanz durch

Install-Module -Name Terminal-Icons -Repository PSGallery 

Dabei reicht das lokale Installieren des PowerShell-Moduls zu seiner Aktivierung nicht aus. Die Ausgabe der diversen Auflistungsbefehle wird nur dann mit den Programmsymbolen angereichert, wenn Sie das Laden des Moduls explizit durch Import-Module -Name Terminal-Icons  anstoßen.

Zur Veränderung des in zur Konsolenausgabe verwendeten Themes bietet sich " PSConsoleTheme" an, dass Sie gewohnt mit Admin-Rechten und

Install-Module PSConsoleTheme  

installieren. Mit Get-ConsoleTheme -ListAvailable  erhalten Sie dann alle verfügbaren Farbprofile. Das eigentliche Aktivieren eines Themes erfolgt dann nach dem Schema Set-ConsoleTheme 'Seti UI'.

Das zur Darstellung der Windows-Benutzeroberfläche verwendete Theme ist via PowerShell ebenfalls ansprechbar. Werkzeug der Wahl ist hier das unter [5] detailliert beschriebene Plug-in "windows-theme", das Sie via Install-Module -Name windows-theme  an den Start bringen.

Fazit

Die vorgestellten Erweiterungen bringen der Microsoft PowerShell neue Tricks bei, deren manuelles Implementieren Sie viele Mannstunden kosten würde. Steht die gewünschte Expansion für die PowerShell zur Verfügung, ist ihr Einsatz einer Selbstentwicklung in so gut wie allen Fällen vorzuziehen. Die praktische Erfahrung lehrt, dass die Wartung einer hauseigenen C#-Erweiterung in Arbeit ausartet – nicht jeder PowerShell-Nutzer ist auch zur Entwicklung in C# befähigt.

Hier geht es zur Themenseite