Jetzt testen

Windows-Prozesse mit PowerShell anzeigen, auslesen und beenden

Inhaltsverzeichnis

Post Featured Image

Die Überwachung und Verwaltung der laufenden Prozesse auf einem Computer ist eine Routineaufgabe für Administratoren. PowerShell kann hier eine wertvolle Hilfe sein, da sich Prozesse und die damit zusammenhängenden Informationen wesentlich schneller und flexibler anzeigen und auswerten lassen.

Im folgenden Artikel erfahren Sie mehr über die Grundlagen der Administration von Prozessen mit PowerShell und wie Sie diese nicht nur lokal, sondern auch remote, z.B. mit PowerShell Direct ausführen können.

 

Get-Process: Prozesse in PowerShell anzeigen

Mit dem Cmdlet Get-Process können Sie alle laufenden Prozesse eines Computers anzeigen lassen. Die Liste der Prozesse ist standardmäßig alphabetisch absteigend sortiert.

Wenn Sie nur Prozesse mit dem Anfangsbuchstaben „s“ anzeigen wollen, können Sie die Liste über den Platzhalter * filtern. Dazu geben Sie folgenden Befehl ein:

Get-Process s*

Auf diese Weise können Sie auch alle anderen Filterungen nach Buchstaben vornehmen. Wenn Sie zum Beispiel alle Prozesse anzeigen wollen, in denen die Zeichenfolge „sql“ vorkommt, können Sie folgenden Befehl verwenden (siehe Abbildung 1):

Get-Process *sql*

Screenshot PowerShell: Abbildung 1: Output des Cmdlets „Get-Process“ mit dem Filter *sql*

bb. 1: Durch den Einsatz von Filtern können mit „Get-Process“ nicht nur Prozesse aufgelistet, sondern auch gefiltert werden.

Get-Process kann Prozesse nicht nur alphabetisch nach ihrem Namen sortieren, sondern z. B. auch auf Basis ihrer Ressourcennutzung. Wenn Sie Prozesse nach Ihrem Namen und nach dem Ressourcen-Verbrauch, zum Beispiel absteigend nach der CPU-Zeit, filtern und sortieren wollen, geben Sie zunächst „Get-Process s*“ ein und verwenden Sie Pipe, um das Ergebnis an „Sort-Object“ weiterzuleiten, mit der Option „|Sort-Object cpu -Descending“:

Get-Process s*|Sort-Object cpu -Descending

Auf diese Weise können Prozesse effektiv gefiltert und sortiert angezeigt werden.

Sie können für einzelne Prozesse auch detailliertere Informationen anzeigen, die in der gesammelten Liste nicht angezeigt werden. Dazu lassen Sie sich zunächst mit „Get-Process“ die von Ihnen gewünschten Prozesse im Überblick anzeigen und geben dieses Ergebnis über die Pipe an das Cmdlet Format-List weiter. Mit dem Platzhalter * stellen Sie sicher, dass alle Informationen zu den Prozessen angezeigt werden.

Hier ein Beispiel, das eine detaillierte Auflistung der Prozesse „winword“ und „explorer“ als Ausgabe generiert:

Get-Process winword, explorer | Format-List *

Anstatt den Befehl „Format-List“ auszuschreiben, können Sie auch mit der Abkürzung „fl“ arbeiten:

Get-Process winword, explorer | fl *

Wenn Sie nicht alle, sondern nur bestimmte Details anzeigen wollen, können Sie anstatt des Platzhalters * bei „fl *“ auch den Namen der entsprechenden Spalte eingeben, zum Beispiel:

Get-Process winword, explorer | fl Name, PriorityClass, FileVersion

Anstatt einer formatierten Liste (|fl *) können Sie die Ergebnisse auch in einer formatierten Tabelle erzeigen lassen. Dazu verwenden Sie für den rechten Teil der Pipeline das Cmdlet „Format-Table“ oder „ft“ (siehe Abbildung 2).

 

Screenshot: Steuern der Anzeige eines PowerShell-Befehls

Abb. 2: Steuern der Anzeige eines PowerShell-Befehls

 

Prozesse über das Netzwerk abfragen

Mit PowerShell können Sie nicht nur die Prozesse des lokalen Computers anzeigen, sondern auch von Computern im Netzwerk. Dazu verwenden Sie den Parameter -Computername und geben danach den Namen des Computers ein, dessen Prozesse Sie anzeigen wollen:

Get-Process *sql* -Computername dl20

Sie können auch mehrere Computer angeben, deren Prozesse Sie anzeigen wollen:

Get-Process *sql* -Computername dl20, dc01, dc02

Mit dem Parameter -Name können mehrere Werte weitergegeben werden, um in einer Sitzung mehr Informationen anzuzeigen:

Get-Process -Name exp*,power*

Um die Liste zu formatieren, kann mit der Weitergabe an Format-List (fl) oder Format-Table (fl) der Name des entsprechenden Servers angezeigt werden, zum Beispiel:

Get-Process -Name PowerShell -ComputerName dc01, dc02, dl20 | Format-Table -Property ID, ProcessName, MachineName

Auf Basis dieser Informationen können Sie Prozesse gezielt beenden, indem Sie das Ergebnis von Get-Process an Stop-Prozess weiterleiten:

Get-Process -Name PowerShell -ComputerName dc01, dc02, dl20 | Stop-Process

Eine weitere Möglichkeit für den Netzwerkzugriff der PowerShell besteht darin, dass Sie in PowerShell oder der PowerShell ISE direkt eine PowerShell-Sitzung auf dem Remoteserver öffnen. Dazu rufen Sie in der PowerShell ISE DateiNeue Remote-PowerShell-Registerkarte auf, geben den Servernamen ein sowie die Anmeldedaten für den Server.

Um eine Remotesitzung in der klassischen PowerShell zu erstellen, geben Sie das Cmdlet New-PSSession ein.  Mit dem Befehl Enter-PSSession bauen Sie eine Verbindung auf. Um sich mit einem anderen Benutzer zu authentifizieren, verwenden Sie folgenden Befehl:

Enter-PSSession -ComputerName -Credential

Mit dem Cmdlet Exit-Session beenden Sie diese Sitzung wieder. Sie können auch Sitzungen unterbrechen und erneut aufzubauen. Bei unterbrochenen Sitzungen laufen die Cmdlets in der Sitzung weiter. Dazu nutzen Sie die Cmdlets Disconnect-PSSession, Connect-PSSession und Receive-PSSession.

Alle Befehle, die Sie in dieser Sitzung ausführen, werden auf dem Remotecomputer ausgeführt. Der Parameter -ComputerName ist in diesem Fall nicht notwendig, da die Sitzung bereits auf dem Remotecomputer ausgeführt wird.

Wenn Sie von einer lokalen PowerShell-Sitzung über das Netzwerk Programme auf einem Remotecomputer starten wollen, verwenden Sie folgenden Befehl:

Invoke-Command -ComputerName -ScriptBlock { } -credential

Mit dem Cmdlet Test-WsMan testen Sie den Zugriff auf den Ziel-Computer. Erhalten Sie keine Fehlermeldung, sondern eine Statusanzeige, funktioniert der Zugriff vom Quell-Computer auf den Ziel-Computer.

Es öffnet sich nun ein Authentifizierungsfenster und Sie werden aufgefordert, das Kennwort für den Benutzer einzugeben (siehe Abbildung 3).


Screenshot PowerShell ISE: When opening a PowerShell session on a remote machine a login prompt appears

Fig. 3: Opening a PowerShell session to manage processes on a remote computer

 

Zugriff auf Prozesse von VM

Sie können mit PowerShell nicht nur auf Prozesse physischer Maschinen zugreifen, sondern auch auf die von virtuellen Maschinen. So können Sie über eine remote PowerShell-Sitzung auf einem Hyper-V-Host auch auf die PowerShell der VMs des Hosts zugreifen (und über diesen Weg ebenfalls Informationen abfragen). Diese Funktion nennt sich PowerShell Direct.

Mit PowerShell Direct können Sie über PowerShell-Sitzungen auf einem Hyper-V-Host auf die VM des Hosts zugreifen und an diesen Aktionen und Abfragen durchführen. PowerShell Direct steht in Windows Server 2016/2019 und neuer zur Verfügung. Diese Voraussetzungen gelten entsprechend auch für die VM, auf die zugegriffen werden soll.

Nach dem Aufbau einer PowerShell Direct-Sitzung können in der Sitzung die gleichen Befehle genutzt werden, wie in lokalen Sitzungen. Um eine Sitzung zu starten, geben Sie in der PowerShell-Sitzung auf dem Host den folgenden Befehl ein:

Enter-PSSession -VMName

Danach befinden Sie sich in der Sitzung mit der PowerShell auf der VM. Sie können auch einzelne Befehle in der PowerShell eingeben. Diese werden zur VM geschickt, in der PowerShell angezeigt und danach befinden Sie sich wieder in der Sitzung auf dem Host:

Invoke-Command -VMName -ScriptBlock { Get-Process }

Wenn Sie sich mit einem anderen Benutzer authentifizieren wollen, verwenden Sie

Enter-PSSession -VMName -Credential

Wenn die aktuellen Anmeldedaten nicht ausreichen, erscheint ein Anmeldefenster direkt in der Konsole.

Mit dem Befehl Exit-Session beenden Sie die Sitzung.

Wie beim PowerShell-Remoting mit physischen Maschinen, können Sie Sitzungen mit VM auch unterbrechen und erneut aufbauen (siehe Abschnitt Prozesse über das Netzwerk abfragen).

 

Prozesse starten und beenden

Sie können mit PowerShell nicht nur Informationen über Prozesse abrufen, sondern diese auch starten (Start-Process), beenden (Stop-Process) und Befehle pausieren, bis ein Prozess beendet ist (Wait-Process). Auch dazu stehen entsprechende Cmdlets zur Verfügung. Um zum Beispiel den Prozess „Notepad“ auf einem Computer zu beenden, verwenden Sie:

Stop-Process -Name "notepad"

Es könne die gleichen Parameter zur Filterung und Sortierung genutzt werden, wie bei Get-Process (siehe Abschnitt Get-Process: Prozesse in der PowerShell anzeigen).

Ein praktisches Beispiel: Sie können mit „Get-Process“ bestimmte Prozesse auslesen und mit Pipe (|) an Stop-Process weiterleiten, um den entsprechenden Prozess zu beenden. Mit einer Kombination der Cmdlets können Sie Prozesse beenden und anzeigen lassen, ob ein Prozess beendet wird. Die Ergebnisse von Abfragen können Sie auch in Variablen speichern:

PS C:> calc
PS C:> $p = Get-Process -Name "calc"
PS C:> Stop-Process -InputObject $p
PS C:> Get-Process | Where-Object {$_.HasExited}

Um zu verhindern, dass Sie versehentlich die falschen Prozesse beenden, können Sie PowerShell mit -Confirm anweisen, erst eine Bestätigung einzuholen, bevor „Stop-Process“ einen Prozess beendet (siehe Abbildung 4):

Stop-Process -Name s* -Confirm

Screenshot PowerShell: Termination of a process after confirmation

Abb. 4: Durch den Einsatz von „-Confirm“ können Sie PowerShell anweisen, Prozesse erst nach Bestätigung zu beenden


Fazit

Wie bereits anfangs beschrieben, beschleunigt der Einsatz von PowerShell das Auslesen von Windows-Prozessen und zusammenhängender Daten. Besonders Power-User wie System-Administratoren profitieren von dieser Zeitersparnis. Doch PowerShell kann weitaus mehr: Es ermöglicht das Administrieren von Remotecomputern, was in Zeiten der Digitalisierung ein entscheidender Vorteil ist.

Der wichtigste Vorteil ist jedoch, dass diese Daten und Informationen durch den Einsatz von PowerShell auch für andere Systeme zugänglich werden. So kann auf Basis eines Scripts zur Windows-Prozess-Überwachung z. B. ein automatisiertes Monitoring aufgebaut werden. Dadurch wird der manuelle und zeitliche Aufwand in der Administration auf ein Minimum reduziert.

 

 

Über den Autor: