Microsoft

Von Get-Service bis WMI: Verwaltung von Windows-Diensten per PowerShell

Die Verwaltung von Windows-Diensten gehört zu den häufigsten Administrator-Aufgaben. Die PowerShell bietet hierfür hilfreiche Cmdlets.

Als System-Administrator gehört die Verwaltung von Windows-Diensten, die eine entscheidende Rolle für Windows Server und Windows-Clients spielen, mit zu den am häufigsten durchzuführenden Aufgaben. Nicht nur das Betriebssystem, sondern auch viele Anwendungen greifen auf diese Dienste zurück.

Das vertraute Fenster der Microsoft Management Console ermöglicht es Administratoren, Dienste auf dem lokalen oder auf entfernten Computern zu verwalten.

Leider skaliert die Konsole aber nicht wirklich gut, wenn Änderungen auf Dutzenden oder Hunderten von Maschinen auf einmal vorgenommen werden sollen.

An dieser Stelle erweist sich die PowerShell als äußerst hilfreich, die einige native Cmdlets zur Verwaltung von Windows-Diensten aufweist:

Get-Command * Service* -Module Microsoft.PowerShell.Management

Abbildung 1: Es gibt verschiedene native Cmdlets, die Administratoren zur Verwaltung von Windows-Diensten einsetzen können.

Diese Cmdlets führen eine Vielzahl unterschiedlicher Aktionen gegenüber jedem gewünschten Service aus.

Get-Service ist dabei das gebräuchlichste Cmdlet. In seiner einfachsten Ausprägung, Get-Service ohne die Verwendung von Parametern, führt es zur Anzeige sämtlicher Dienste auf dem lokalen Computer. Die meisten Administratoren müssen jedoch die Dienste auf entfernten Computern ausfindig machen. Dies kann mit Hilfe des Parameters ComputerName erreicht werden.

Get-Service –ComputerName CLIENT1

Abbildung 2: Get-Service lässt sich auch auf Remote-Computern anwenden.

Die Nutzung von Get-Service zeigt auf diese Weise alle Dienste an, die auf dem Remote-Client ablaufen.

Verwaltung mehrerer Computer

Was aber, wenn man die Dienste gleich mehrerer Computer sehen möchte? In diesem Fall ist eine Liste der Computernamen als Textdatei sehr hilfreich. Eine solche Liste kann auf unterschiedlichste Weise generiert werden, beispielsweise per Active Directory, über Business-Anwendungen, ein Verwaltungssystem für Clients oder auch eine eigene Datenbank.

Die PowerShell verfügt über ein Cmdlet namens Get-Content, mit dem sich dann jeder Computer-Name aus dieser Datei auslesen lässt. Zusätzlich kommt eine foreach-Schleife zum Einsatz:

Get-Content C:\Computers.txt | foreach {Get-Service –ComputerName $_}

Windows-Services über die PowerShell verändern

Gehen wir nun ein wenig tiefer in die Details und verändern einige dieser Dienste. Eine ziemlich gängige Aufgabe ist es beispielsweise, einen Dienst neu zu starten, wenn er sich unerwartet verhält oder um eine Änderung an seiner Konfiguration anzuwenden. Nehmen wir als Beispiel den Dienst Application Layer Gateway (ALG), den wir auf allen Computern neu starten möchten, deren Namen sich in der vorhin schon behandelten Textdatei finden.

Dies kann unkompliziert erledigt werden, indem wir einen spezifischen Dienst für die Suche vorgeben und das dadurch gefundene Objekt dann an Restart-Service weiterleiten:

Get-Content C:\Computers.txt | foreach {Get-Service –ComputerName $_ -Name ALG | Restart-Service }

Sofern der Dienst auf dem Zielsystem gestoppt wird, sorgt Restart-Service dafür, dass er nunmehr gestartet wird.

Set-Service steuert Windows-Dienste

Bei Set-Service handelt es sich um ein weiteres Cmdlet, das viele unterschiedliche Attribute eines Windows-Dienstes verändern kann, beispielsweise das Startverhalten eines Dienstes. Damit lässt sich festlegen, dass ein Dienst gemeinsam mit dem Betriebssystem gestartet werden soll, manuell gestartet werden muss oder deaktiviert ist, ein Start des Dienstes also insgesamt verhindert wird. Set-Service verfügt dafür über den Parameter StartupType, mit dessen Hilfe dieses Verhalten konfiguriert werden kann.

Die im Folgenden aufgeführten Befehle setzen das Startverhalten des Dienstes ALG so fest, dass er auf allen Computern deaktiviert wird, deren Namen sich in der Textdatei C:\Computers.txt finden lassen:

Get-Content C:\Computers.txt | foreach {Get-Service –ComputerName $_ -Name ALG | Set-Service –StartupType Disabled }

Kombination aus PowerShell und WMI für noch mehr Funktionalität

Es gibt einige Fälle, in denen die standardmäßig vorhandenen Cmdlets entweder keine ausreichenden Informationen anbieten oder auch die Möglichkeit zur Modifikation eines bestimmten Attributs nicht ausreichend gegeben ist. In solchen Fällen besteht eine hilfreiche Möglichkeit darin, sich der Windows Management Instrumentation (WMI) zu bedienen. WMI verfügt über eine Klasse mit dem Namen Win32_Service, die mithilfe der Cmdlets Get-CimInstance oder Get-WmiObject aufgerufen werden kann.

Get-CimInstance –ComputerName client1 –ClassName Win32_Service

Abbildung 3: Bei Nutzung der WMI Klasse Win32_Service in Verbindung mit der PowerShell werden zusätzliche Details über einen Windows-Dienst auf einem Computer enthüllt.

Administratoren können über einen Dienst aber noch viel mehr Informationen erhalten. Hierfür springt der Parameter Property helfend zur Seite. Mit einem Sternchen versehen kann er den Dienst über WMI auskundschaften:

Get-CimInstance –ComputerName CLIENT1 –ClassName Win32_Service –Property *

Abbildung 4: Der Parameter Property der Klasse Win32_Service kann weit umfassendere Informationen über einen Windows-Dienst offenlegen.

Um einen noch umfassenderen Einblick zu erhalten, wie die standardmäßigen PowerShell-Cmdlets für die Nutzung mit Diensten arbeiten, hilft ein Blick auf die Methoden der Objekte einer WMI-Dienst-Instanz:

Get-WmiObject –ComputerName CLIENT1 –Class Win32_Service | Get-Member –MemberType Method

Abbildung 5: Untersuchung der Methoden von Objekten einer WMI-Dienst-Instanz.

Diese Methoden können dann in Bezug auf die Dienstobjekte angewendet werden, indem sie folgendermanßen aufgerufen werden:

Get-WmiObject –ComputerName CLIENT1 –Class Win32_Service –Filter "Name='ALG'" | foreach {$_.StopService()}

In dem obigen Beispiel wird der Parameter Filter genutzt, um die Anfrage ausschließlich auf den Dienst ALG begrenzen zu können. Dieser Dienst wird dann an das ForEach-Object weitergereicht und daraufhin die Methode StopService() aufgerufen, welche dann ihrerseits den Dienst beendet. Auch wenn ein solches Vorgehen in diesem Fall eigentlich nicht notwendig ist, weil es das Cmdlet Stop-Service gibt, so bietet dieses Beispiel doch einen guten Einblick in die Funktionsweise der Cmdlets für Windows-Dienste.

Folgen Sie SearchDataCenter.de auch auf Twitter, Google+, Xing und Facebook!

Erfahren Sie mehr über Serverbetriebssysteme

ComputerWeekly.de
Close