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


Tags: ,
I like Google Plus

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

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht angezeigt. Wenn mit Ihrer angegebenen Mail-Adresse ein Gravatar verknüpft ist, dann wird dieser neben Ihrem Kommentar eingeblendet.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Zeilen und Absätze werden automatisch erzeugt.
  • Mail-Adressen werden im Seitenquelltext unkenntlich gemacht, um sie vor dem automatischen Erfassen durch Spammer zu schützen.

Weitere Informationen über Formatierungsoptionen