Prozess-ID und Name von Diensten auslesen mit eigenen Powershell-Properties


    Tags: ,

    Die Stärken der PowerShell liegen in der Leichtigkeit, mit der sich neue Objekte definieren und vorhandenen Objekte neue Properties anhängen lassen. Das Ganze ist viel einfacher, als es sich zunächst anhört. Hat man den sprichwörtlichen Bogen erst einmal raus, ergeben sich unzählige Möglichkeiten beliebige Ergebnisse über eine individuelle Property an einen Objekt-Output anzuhängen.

    Hier ein konkretes Beispiel. Ein Get-Service liefert eine Liste aller vorhandenen Dienste, allerdings ohne den dazu gehörigen Prozess, in dem der Dienst läuft. Diese Angaben erhält man über eine WMI-Abfrage:

    Get-WmiObject -Class Win32_Service | Select-Object -Property Name, ProcessID

    Möchte man auch den dazugehörigen Prozessnamen erhalten, fügt man lediglich eine weitere Property an, deren Wert das Ergebnis eines Aufrufs von Get-Process ist, bei dem der ID-Parameter dieses Cmdlets den Wert der ProcessID-Property anhält.

    Was sich vielleicht kompliziert anhören mag, ist in der Umsetzung sehr einfach. Vorausgesetzt man weiß, was eine Hashtable ist, denn über eine solche wird eine neue Property definiert:

    Get-WmiObject -Class Win32_Service -Filter "ProcessID <> 0" | Select-Object -Property Name, ProcessID, @{Name="Prozess";Expression={Get-Process -ID $_.ProcessID | Select-Object -ExpandProperty Name }}

    Dieser Aufruf hängt den Namen eines Prozesses als weitere Property an.

    Liegt ein Wert als Property vor, lässt sich nach diesem Wert die Ausgabe z.B. gruppieren. Der folgende Befehl gruppiert alle Dienste nach ihrem "Host-Prozess" und sortiert die Ausgabe nach der Anzahl der Dienste pro Prozess:

    Get-WmiObject -Class Win32_Service -Filter "ProcessID <> 0" | Select-Object -Property Name, ProcessID, @{Name="Prozess";Expression={Get-Process -ID $_.ProcessID | Select-Object -ExpandProperty Name }} | Group-Object -Property Prozess | Sort-Object -Property Count -Descending

    Ausgabe:

    Count    Name   Group
    ----- ---- -----
    56 svchost {@{Name=AppHostSvc; ProcessID=1780; Prozess=...
    3 lsass {@{Name=KeyIso; ProcessID=524; Prozess=lsass...
    2 sqlservr {@{Name=MSSQL$SQLEXPRESS; ProcessID=1112; Pr...

    So elegant lassen sich Daten nur mit der PowerShell aggregieren.

    Keine Kommentare