Dienste (Services) auflisten und kontrollieren

Veröffentlicht: 08. Jul 2003 | Aktualisiert: 28. Jun 2004

Von Mathias Schiffer

In diesem MSDN Quickie erfahren Sie, wie Sie Windows NT-Dienste auflisten, abfragen und sogar steuern können.

Das .NET Framework macht es Ihnen sehr einfach, auf Windows NT-Dienste (Services) zuzugreifen. Den hierfür erforderlichen Namespace System.ServiceProcess müssen Sie jedoch zunächst referenzieren.

Verwenden Sie dafür unter Visual Studio.NET einfach das "Project"-Menü, aus dem Sie den Menüpunkt "Add Reference" auswählen. In der Komponentenliste des Reiters ".NET" klicken Sie dann doppelt auf "System.ServiceProcess.Dll" und klicken auf "OK" - fertig.

In Ihrem Codemodul verwenden Sie dann am besten die Imports-Direktive, um "System.ServiceProcess" zu importieren: So sparen Sie sich für die weiteren Schritte eine Menge an Schreibarbeit und unlesbar langer Codezeilen.

Über ServiceControler.GetServices() können Sie nun ein Array von ServiceController-Objekten abholen, in dem jedes Element einen der lokalen Windows-Services repräsentiert. Auf einfachste Weise können Sie so beispielsweise eine Liste der Anzeigenamen aller Services zusammenstellen:

' Referenzieren Sie System.ServiceProcess.dll 
' [Project]->[Add Reference]->[.NET] 
' und fügen Sie Ihrem Modul die folgende 
' Imports-Direktive hinzu: 
' Imports System.ServiceProcess 
Dim sc As ServiceController 
' Alle Dienste auflisten: 
Console.WriteLine() 
Console.WriteLine("Vorhandene Dienste (Aktueller Status):") 
Console.WriteLine("--------------------------------------") 
For Each sc In ServiceController.GetServices() 
  Console.WriteLine(sc.DisplayName & " (" & sc.Status.ToString & ")") 
Next

Möchten Sie die Services auf einer anderen Maschine erfassen, so verwenden Sie einfach deren Netzwerknamen als Argument der GetServices-Funktion:

' Alle Dienste auf Maschine "WWWServer" auflisten: 
Console.WriteLine() 
Console.WriteLine("Dienste auf WWWServer (Aktueller Status):") 
Console.WriteLine("--------------------------------------") 
For Each sc In ServiceController.GetServices("WWWServer") 
  Console.WriteLine(sc.DisplayName & " (" & sc.Status.ToString & ")") 
Next

Natürlich können Sie auch beispielsweise den aktuellen Zustand eines Dienstes als Kriterium heranziehen - etwa, um nur solche Dienste aufzuführen, die aktuell gestartet sind: Dank des ServiceController-Objekts und seiner Status-Eigenschaft kein weiteres Problem:

' Alle Dienste durchgehen und nur laufende Dienste ausgeben: 
Console.WriteLine() 
Console.WriteLine("Gestartete Dienste:") 
Console.WriteLine("-------------------") 
For Each sc In ServiceController.GetServices() 
  If sc.Status = ServiceControllerStatus.Running Then 
 Console.WriteLine(sc.DisplayName) 
  End If 
Next

Doch nicht nur Informationen über den aktuellen Zustand eines Dienstes können Sie so ermitteln: Sie können einen Windows Service so auch steuern. Auch hierfür benötigen Sie nicht mehr als ein ServiceController-Objekt, das einen Dienst repräsentiert.

Auch hierfür sollen ein paar einfache und selbsterklärende Beispiele nicht fehlen:

' Einen Dienst beenden (der beendet werden kann): 
If sc.CanStop Then 
  sc.Stop() 
End If 
' Einen angehaltenen Dienst starten und darauf warten, 
' dass dies erfolgreich geschehen ist: 
If sc.Status = ServiceControllerStatus.Stopped Then 
  sc.Start() 
  sc.WaitForStatus(ServiceControllerStatus.Running) 
End If 
' Einen laufenden Dienst pausieren und weiterführen, 
' falls möglich: 
If sc.Status = ServiceControllerStatus.Running Then 
  If sc.CanPauseAndContinue Then 
 sc.Pause() 
 sc.WaitForStatus(ServiceControllerStatus.Paused) 
 sc.Continue() 
 sc.WaitForStatus(ServiceControllerStatus.Running) 
  End If 
End If

In diesem Rahmen sollen nicht sämtliche Möglichkeiten von System.ServiceProcess haarklein aufgezeigt werden. Wie Sie jedoch jetzt schon sehen, lohnt sich ein Blick in diese Bibliothek ungemein, wenn Sie unter .NET mit Diensten arbeiten möchten.