Ich habe eine Anwendung in C# (2.0 läuft unter XP Embedded), die mit einem 'Watchdog' kommuniziert, der als Windows-Dienst implementiert ist. Wenn das Gerät startet, benötigt dieser Dienst normalerweise etwas Zeit zum Starten. Ich möchte anhand meines Codes überprüfen, ob der Dienst ausgeführt wird. Wie kann ich das erreichen?Wie kann ich überprüfen, ob ein Windows-Dienst ausgeführt wird
Antwort
Ich denke, so etwas wie dies funktionieren würde:
hinzufügen System.ServiceProcess zu Ihren Projektreferenzen (es ist auf der Registerkarte .NET).
Der schnelle Weg:
return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running;
Der sicherere Weg:
try
{
using(ServiceController sc = new ServiceController(SERVICE_NAME))
{
return sc.Status == ServiceControllerStatus.Running;
}
}
catch(ArgumentException) { return false; }
catch(Win32Exception) { return false; }
Die ausführliche Art und Weise:
using System.ServiceProcess;
//
ServiceController sc;
try
{
sc = new ServiceController(SERVICE_NAME);
}
catch(ArgumentException)
{
return "Invalid service name."; // Note that just because a name is valid does not mean the service exists.
}
using(sc)
{
ServiceControllerStatus status;
try
{
sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically.
status = sc.Status;
}
catch(Win32Exception ex)
{
// A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status.
// See Win32 QueryServiceStatus()'s documentation.
return "Error: " + ex.Message;
}
switch(status)
{
case ServiceControllerStatus.Running:
return "Running";
case ServiceControllerStatus.Stopped:
return "Stopped";
case ServiceControllerStatus.Paused:
return "Paused";
case ServiceControllerStatus.StopPending:
return "Stopping";
case ServiceControllerStatus.StartPending:
return "Starting";
default:
return "Status Changing";
}
}
Edit: Es gibt auch ein Verfahren sc.WaitforStatus()
, die einen gewünschten Zustand nimmt und eine Zeitüberschreitung, nie benutzt, aber es kann Ihren Bedürfnissen entsprechen.
Edit: Sobald Sie den Status erhalten, müssen Sie zuerst sc.Refresh()
aufrufen, um den Status zu erhalten.
Referenz: ServiceController Objekt in .NET.
Bitte werfen Sie einen Blick auf das Objekt ServiceController in .NET.
Oooh ... sogar besser als rollen Ihre eigenen über WMI. Ich werde meine Antwort entfernen. – EBGreen
@EBGreen - Ich weiß nicht, die WMI-Route kann in Zukunft für jemand anderen nützlich sein, es gibt mehr als eine Möglichkeit, eine Katze zu häuten, und all das .... – Carl
Ja, aber ich glaube wirklich, dass ServiceController besser ist über alles, also denke ich, ich werde es gelöscht lassen. Ich hätte niemals WMI vorgeschlagen, wenn ich nicht gerade aufgewacht wäre. :) – EBGreen
Hier erhalten Sie alle verfügbaren Dienste und deren Status auf Ihrem lokalen Rechner.
ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
Console.WriteLine(service.ServiceName+"=="+ service.Status);
}
Sie können Ihren Service mit service.name Eigenschaft innerhalb Schleife vergleichen und erhalten Sie den Status Ihres Dienstes. Für Details gehen Sie mit der http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx auch http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx
- 1. Überprüfen, ob ein Programm ausgeführt wird
- 2. Wie kann ich überprüfen, wie oft ein Replikationsagent ausgeführt wird?
- 3. Überprüfen Sie, ob ein Python-Skript ordnungsgemäß ausgeführt wird und ob es nicht erneut ausgeführt wird.
- 4. Überprüfen, ob der CSS3-Übergang ausgeführt wird
- 5. Überprüfen Sie, ob ein Windows-Dienst ausgeführt wird?
- 6. Überprüfen Sie, ob ein MotionEvent.ACTION_MOVE ausgeführt wurde
- 7. Überprüfen Sie, ob ein Prozess mit Shell-Skript ausgeführt wird
- 8. Wie kann ich feststellen, ob eine Vollbildanwendung ausgeführt wird?
- 9. Wie kann ich überprüfen, ob ein Datumsbereich ein Wochenende umfasst?
- 10. Wie kann ich feststellen, ob mein Prozess interaktiv ausgeführt wird?
- 11. Wie kann ich überprüfen, ob auf dem Benutzeroberflächen-Thread in Android ausgeführt wird?
- 12. Wie kann ich überprüfen, ob ein Ajax .load Anruf
- 13. Überprüfen Sie, ob der Prozess als eine Pipe ausgeführt wird
- 14. Wie kann ich überprüfen, ob ein Wert eine Zahl ist?
- 15. Überprüfen Sie, ob eine bestimmte EXE-Datei ausgeführt wird
- 16. wie kann ich überprüfen, ob ein Objekt C existiert in ++
- 17. Wie kann ich überprüfen, ob ein untergeordnetes Browserfenster geladen wurde?
- 18. Python: überprüfen, ob ein Hostname aufgelöst wird
- 19. Wie kann ich in einer Batchdatei feststellen, ob ein Prozess ausgeführt wird?
- 20. Überprüfen Sie, ob Methode zum ersten Mal ausgeführt wird. C#
- 21. Wie kann ich überprüfen, ob ein Vim-Puffer änderbar ist?
- 22. Wie kann ich überprüfen, ob ein Dialog geschlossen ist?
- 23. Wie kann ich überprüfen, ob ein Array leer ist?
- 24. Wie kann ich überprüfen, ob ein Zertifikat selbstsigniert ist?
- 25. Wie kann ich überprüfen, ob ein AD-Konto gesperrt ist?
- 26. Überprüfen, ob Code in Interface Builder ausgeführt wird
- 27. Überprüfen Sie, ob der Dienst unter Android ausgeführt wird.
- 28. Überprüfen Sie, ob die Anwendung ausgeführt wird - InstallJammer
- 29. Wie kann ich feststellen, ob meine iPhone App ausgeführt wird, wenn eine Push-Benachrichtigung empfangen wird?
- 30. Wie kann ich wissen, ob ein ModalViewController angezeigt wird?
ServiceController.GetServices() ruft ein Array ab, das den gesamten installierten Dienst als ServiceController-Objekt enthält. Dies kann sehr hilfreich sein. – Larry
Guter Anruf, ich weiß nicht, ob ich das jemals benutzt habe. Auch wenn Sie es nie verwenden, denke ich, dass es für das Debuggen nützlich wäre, wenn nichts anderes – Carl
sc.WaitforStatus() genau das ist, was ich brauche. Thx – edosoft