Bir Windows Hizmetinin çalışıp çalışmadığını nasıl doğrulayabilirim


182

Windows hizmeti olarak uygulanan bir 'bekçi köpeği' ile iletişim kuran bir uygulama C # (XP XP üzerinde çalışan) var. Aygıt önyükleme yaptığında, bu hizmetin başlaması genellikle biraz zaman alır. Hizmetin çalışıp çalışmadığını kodumdan kontrol etmek istiyorum. Bunu nasıl başarabilirim?


1
Lütfen .NET'te ServiceController nesnesine bir göz atın .
— Larry

Oooh ... WMI ile kendi yuvarlanmandan bile daha iyi Cevabımı kaldıracağım.
— EBGreen

@EBGreen - Bilmiyorum, WMI yolu gelecekte başka biri için yararlı olabilir, bir kedi derisi için birden fazla yol var, ve tüm bunlar ....
— Carl

Ya, ama gerçekten ServiceController her şeyden iyi olduğunu düşünüyorum, bu yüzden ben silinmiş bırakacağımı düşünüyorum. Sadece uyandırmamış olsaydım, WMI'yi asla öneremezdim. :)
— EBGreen

Yanıtlar:


366

Sanırım böyle bir şey işe yarayacak:

System.ServiceProcessProje referanslarınıza ekleyin (.NET sekmesinde bulunur).

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";
}

Düzenleme: Ayrıca sc.WaitforStatus(), hiç kullanılmayan bir durum ve bir zaman aşımı süren bir yöntem vardır, ancak ihtiyaçlarınıza uygun olabilir.

Düzenleme: Durumu aldıktan sonra, durumu tekrar almak için sc.Refresh()önce aramanız gerekir .

Başvuru: .NET'te ServiceController nesnesi.


11
ServiceController.GetServices (), yüklü tüm hizmeti ServiceController nesnesi olarak içeren bir dizi alır. Bu çok yardımcı olabilir.
— Larry

9
System.ServiceProcess'e başvuru ekleyin ve deyimi ekleyin: using System.ServiceProcess;
— NealWalters

6
Kötü bir hizmet adı geçersem, bir hata atmak yerine kilitleniyor gibiydi. Bu kodu ekledim: catch (System.Exception ex) {return "Bulunamadı"; }
— NealWalters

6
NealWalters: Sadece hizmet bulunamadığı için istisnanın atıldığını nereden biliyorsunuz? Yakalamak için daha uygun bir istisna türü yok mu?
— Patrik Svensson

3
özel statik bool ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
— Dmitry Pavlov

16

Burada mevcut tüm hizmetleri ve durumlarını yerel makinenizde bulabilirsiniz.

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

Hizmetinizi döngü içindeki service.name özelliği ile karşılaştırabilir ve hizmetinizin durumunu alabilirsiniz. Ayrıntılar için http://msdn.microsoft.com/tr-tr/library/system.serviceprocess.servicecontroller.aspx adresine gidin ve ayrıca http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.