/// <summary>
/// Stellt Funktionen für das Starten, Pausieren, Fortführen und Beenden eines Windows-Dienstes dar.
/// </summary>
static class ServiceHelper
{
/// <summary>
/// Gibt Bezeichner an, die den Rückgabewert einer <see cref="ServiceHelper"/>-Funktion angeben.
/// </summary>
public enum ServiceResult
{
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist Ok.
/// </summary>
Ok = 1,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist Error.
/// </summary>
Error = 2,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist CanNotPause.
/// </summary>
CanNotPause = 3,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist CanNotContinue.
/// </summary>
CanNotContinue = 4,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist CanNotStop.
/// </summary>
CanNotStop = 5,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist AlreadyRunning.
/// </summary>
AlreadyRunning = 6,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist AlreadyPaused.
/// </summary>
AlreadyPaused = 7,
/// <summary>
/// Der Rückgabewert der <see cref="ServiceHelper"/>-Funktion ist AlredyStopped.
/// </summary>
AlredyStopped = 8,
}
/// <summary>
/// Startet einen Dienst.
/// </summary>
/// <param name="serviceName">
/// Der Name des Dienstes, der gestartet werden soll.
/// </param>
/// <param name="machineName">
/// Der Name der Maschine, auf der der Dienst gestartet werden soll.
/// Soll der Dienst auf der lokalen Maschine gestartet werden, muss "localhost" übergeben werden.
/// </param>
/// <param name="arguments">
/// Argumente, die beim Starten des Dienstes übergeben werden sollen.
/// </param>
/// <param name="timeout">
/// Die Zeitspanne, die gewartet werden soll, bis der Dienst den angegebenen Zustand annimmt.
/// </param>
/// <returns>
/// Einer der <see cref="ServiceResult"/>-Werte.
/// </returns>
public static ServiceResult StartService(string serviceName, string machineName, string[] arguments, TimeSpan timeout)
{
ServiceController service = null;
try
{
service = new ServiceController(serviceName, machineName == "localhost" ? "." : machineName);
if (service.Status != ServiceControllerStatus.Running &&
service.Status != ServiceControllerStatus.StartPending &&
service.Status != ServiceControllerStatus.ContinuePending)
{
if (arguments != null)
{
service.Start(arguments);
}
else
{
service.Start();
}
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
return ServiceResult.Ok;
}
else
{
return ServiceResult.AlreadyRunning;
}
}
catch
{
return ServiceResult.Error;
}
finally
{
if (service != null)
{
service.Close();
}
}
}
/// <summary>
/// Hält einen Dienst an.
/// </summary>
/// <param name="serviceName">
/// Der Name des Dienstes, der angehalten werden soll.
/// </param>
/// <param name="machineName">
/// Der Name der Maschine, auf der der anzuhaltende Dienst läuft.
/// Läuft der Dienst auf der lokalen Maschine, muss "localhost" übergeben werden.
/// </param>
/// <param name="timeout">
/// Die Zeitspanne, die gewartet werden soll, bis der Dienst den angegebenen Zustand annimmt.
/// </param>
/// <returns>
/// Einer der <see cref="ServiceResult"/>-Werte.
/// </returns>
public static ServiceResult PauseService(string serviceName, string machineName, TimeSpan timeout)
{
ServiceController service = null;
try
{
service = new ServiceController(serviceName, machineName == "localhost" ? "." : machineName);
if (service.CanPauseAndContinue == true)
{
if (service.Status != ServiceControllerStatus.Paused &&
service.Status != ServiceControllerStatus.PausePending &&
service.Status != ServiceControllerStatus.StopPending)
{
service.Pause();
service.WaitForStatus(ServiceControllerStatus.Paused, timeout);
return ServiceResult.Ok;
}
else
{
return ServiceResult.AlreadyPaused;
}
}
else
{
return ServiceResult.CanNotPause;
}
}
catch
{
return ServiceResult.Error;
}
finally
{
if (service != null)
{
service.Close();
}
}
}
/// <summary>
/// Führt einen angehaltenen Dienst fort.
/// </summary>
/// <param name="serviceName">
/// Der Name des Dienstes, der fortgefürt werden soll.
/// </param>
/// <param name="machineName">
/// Der Name der Maschine, auf der der Dienst fortgeführt werden soll.
/// Soll der Dienst auf der lokalen Maschine fortgeführt werden, muss "localhost" übergeben werden.
/// </param>
/// <param name="timeout">
/// Die Zeitspanne, die gewartet werden soll, bis der Dienst den angegebenen Zustand annimmt.
/// </param>
/// <returns>
/// Einer der <see cref="ServiceResult"/>-Werte.
/// </returns>
public static ServiceResult ContinueService(string serviceName, string machineName, TimeSpan timeout)
{
ServiceController service = null;
try
{
service = new ServiceController(serviceName, machineName == "localhost" ? "." : machineName);
if (service.CanPauseAndContinue == true)
{
if (service.Status != ServiceControllerStatus.Running &&
service.Status != ServiceControllerStatus.StartPending &&
service.Status != ServiceControllerStatus.ContinuePending)
{
service.Continue();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
return ServiceResult.Ok;
}
else
{
return ServiceResult.AlreadyRunning;
}
}
else
{
return ServiceResult.CanNotContinue;
}
}
catch
{
return ServiceResult.Error;
}
finally
{
if (service != null)
{
service.Close();
}
}
}
/// <summary>
/// Stoppt einen Dienst.
/// </summary>
/// <param name="serviceName">
/// Der Name des Dienstes, der gestoppt werden soll.
/// </param>
/// <param name="machineName">
/// Der Name der Maschine, auf der der zu stoppende Dienst läuft.
/// Läuft der Dienst auf der lokalen Maschine, muss "localhost" übergeben werden.
/// </param>
/// <param name="timeout">
/// Die Zeitspanne, die gewartet werden soll, bis der Dienst den angegebenen Zustand annimmt.
/// </param>
/// <returns>
/// Einer der <see cref="ServiceResult"/>-Werte.
/// </returns>
public static ServiceResult StopService(string serviceName, string machineName, TimeSpan timeout)
{
ServiceController service = null;
try
{
service = new ServiceController(serviceName, machineName == "localhost" ? "." : machineName);
if (service.CanStop == true)
{
if (service.Status != ServiceControllerStatus.Stopped &&
service.Status != ServiceControllerStatus.StopPending)
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
return ServiceResult.Ok;
}
else
{
return ServiceResult.AlredyStopped;
}
}
else
{
return ServiceResult.CanNotStop;
}
}
catch
{
return ServiceResult.Error;
}
finally
{
if (service != null)
{
service.Close();
}
}
}
}