ฉันจะตรวจสอบว่าบริการ Windows กำลังทำงานอยู่ได้อย่างไร


182

ฉันมีแอปพลิเคชันใน C # (2.0 ทำงานบน XP ฝังตัว) ที่กำลังสื่อสารกับ 'watchdog' ที่ใช้งานเป็นบริการ Windows เมื่ออุปกรณ์บู๊ตบริการนี้มักจะใช้เวลาในการเริ่มต้น ฉันต้องการตรวจสอบจากรหัสของฉันหากบริการกำลังทำงานอยู่ ฉันจะทำสิ่งนี้ได้อย่างไร


1
โปรดดูที่วัตถุServiceControllerใน. NET
Larry

Oooh ... ดียิ่งกว่าการม้วนตัวเองผ่าน WMI ฉันจะลบคำตอบของฉัน
EBGreen

@EBGreen - ผมไม่ทราบว่าเส้นทาง WMI อาจจะมีประโยชน์สำหรับคนอื่นในอนาคตมีมากกว่าหนึ่งวิธีเพื่อผิวแมวและทุกคนที่ ....
คาร์ล

ใช่ แต่ฉันคิดว่า ServiceController ดีกว่าทั้งหมดดังนั้นฉันคิดว่าฉันจะลบมันทิ้ง ฉันไม่เคยจะแนะนำ WMI ด้วยซ้ำถ้าฉันไม่ได้ตื่นขึ้นมา :)
EBGreen

คำตอบ:


366

ฉันเดาว่าสิ่งนี้จะได้ผล:

เพิ่มSystem.ServiceProcessลงในการอ้างอิงโครงการของคุณ (อยู่ในแท็บ. NET)

using System.ServiceProcess;

ServiceController sc = new ServiceController(SERVICENAME);

switch (sc.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";
}

แก้ไข: นอกจากนี้ยังมีวิธีการsc.WaitforStatus()ที่ใช้สถานะที่ต้องการและหมดเวลาไม่เคยใช้ แต่มันอาจเหมาะสมกับความต้องการของคุณ

แก้ไข: เมื่อคุณได้รับสถานะเพื่อรับสถานะอีกครั้งคุณจะต้องโทรsc.Refresh()ก่อน

การอ้างอิง: วัตถุServiceControllerใน. NET


11
ServiceController.GetServices () ดึงข้อมูลอาร์เรย์ที่มีบริการทั้งหมดที่ติดตั้งไว้เป็นวัตถุ ServiceController สิ่งนี้อาจช่วยได้มาก
Larry

9
เพิ่มการอ้างอิงถึง System.ServiceProcess และเพิ่มคำสั่ง: using System.ServiceProcess;
NealWalters

6
ถ้าฉันผ่านชื่อบริการที่ไม่ดีดูเหมือนว่าจะล็อคแทนการโยนข้อผิดพลาด ฉันเพิ่มรหัสนี้: catch (System.Exception ex) {ส่งคืน "ไม่พบ"; }
NealWalters

6
NealWalters: คุณจะรู้ได้อย่างไรว่าข้อยกเว้นนั้นเกิดขึ้นเพียงเพราะไม่พบบริการ ไม่มีประเภทข้อยกเว้นที่เหมาะสมกว่าที่จะจับใช่หรือไม่
Patrik Svensson

3
Serviceool แบบบูลสแตติกส่วนตัว }
Dmitry Pavlov

16

ที่นี่คุณจะได้รับบริการและสถานะทั้งหมดในเครื่องท้องถิ่นของคุณ

ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
    Console.WriteLine(service.ServiceName+"=="+ service.Status);
}

คุณสามารถเปรียบเทียบบริการของคุณกับคุณสมบัติ service.name ภายในลูปและคุณจะได้รับสถานะบริการของคุณ สำหรับรายละเอียดไปที่ http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx นอกจากนี้ยัง http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.