Bagaimana saya bisa memverifikasi jika Layanan Windows sedang berjalan

182

Saya memiliki aplikasi dalam C # (2.0 berjalan pada XP tertanam) yang berkomunikasi dengan 'pengawas' yang diimplementasikan sebagai Layanan Windows. Saat perangkat melakukan booting, layanan ini biasanya membutuhkan waktu untuk memulai. Saya ingin memeriksa, dari kode saya, apakah layanan ini berjalan. Bagaimana saya bisa mencapai ini?

edosoft
sumber
1
Silakan lihat objek ServiceController di .NET.
Larry
Oooh ... bahkan lebih baik daripada menggulung sendiri melalui WMI. Saya akan menghapus jawaban saya.
EBGreen
@EBGreen - Saya tidak tahu, rute WMI mungkin berguna untuk orang lain di masa depan, ada lebih dari satu cara untuk menguliti kucing, dan semua itu ....
Carl
Ya, tapi saya benar-benar berpikir ServiceController lebih baik dari semua, jadi saya pikir saya akan membiarkannya dihapus. Saya tidak akan pernah menyarankan WMI jika saya tidak baru saja bangun. :)
EBGreen

Jawaban:

366

Saya kira sesuatu seperti ini akan berhasil:

Tambahkan System.ServiceProcesske referensi proyek Anda (Ada di tab .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";
}

Sunting: Ada juga metode sc.WaitforStatus()yang mengambil status dan batas waktu yang diinginkan, tidak pernah menggunakannya tetapi mungkin sesuai dengan kebutuhan Anda.

Sunting: Setelah Anda mendapatkan status, untuk mendapatkan status itu lagi, Anda harus menelepon sc.Refresh()dulu.

Referensi: Objek ServiceController di .NET.

Carl
sumber
11
ServiceController.GetServices () mengambil larik yang berisi semua layanan yang diinstal sebagai objek ServiceController. Ini mungkin banyak membantu.
Larry
9
Tambahkan referensi ke System.ServiceProcess dan tambahkan pernyataan: using System.ServiceProcess;
NealWalters
6
Jika saya memberikan nama layanan yang buruk, sepertinya terkunci alih-alih melemparkan kesalahan. Saya menambahkan kode ini: catch (System.Exception ex) {return "Not found"; }
NealWalters
6
NealWalters: Bagaimana Anda tahu pengecualian dilemparkan hanya karena layanan itu tidak ditemukan? Apakah tidak ada jenis pengecualian yang lebih cocok untuk ditangkap?
Patrik Svensson
3
private static bool ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov
16

Di sini Anda mendapatkan semua layanan yang tersedia dan statusnya di mesin lokal Anda.

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

Anda dapat membandingkan layanan Anda dengan properti service.name di dalam loop dan Anda mendapatkan status layanan Anda. Untuk detail, kunjungi http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx juga http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

rhatwar007
sumber