2012-04-30 11 views
6

Czy istnieje metoda .NET (C#) lub wywołanie interfejsu API, które można użyć do sprawdzenia, czy usługa systemu Windows jest wyłączona? Odpowiedni artykuł MSDN is here.Zapytanie, czy usługa systemu Windows jest wyłączona (bez korzystania z Rejestru)?

Chcę uniknąć bezpośredniego wpisywania rejestru. Poniżej znajduje się część kodu, którego teraz używam (i działa). Jednak szukam czegoś bardziej eleganckiego i mniej inwazyjnego.

const String basepathStr = @"System\CurrentControlSet\services\"; 
String subKeyStr = basepathStr + servicenameStr; 

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(subKeyStr)) 
{ 
    return (int) key.GetValue("Start"); 
} 

Zrobiłem znaleźć simliar question ale miałem nadzieję na lepszą odpowiedź ponieważ odpowiedzi są prawdopodobnie nieaktualne (3 lata minęły).

Odpowiedz

7

To najbardziej odpowiednia część kodu, z której zdecydowałem się skorzystać ... dziękuję za pomoc!

StartupState state = StartupState.Unknown; 
    try 
    { 
     PermissionSet fullTrust = new PermissionSet(System.Security.Permissions.PermissionState.Unrestricted); 
     fullTrust.Demand(); 
     string wmiQuery = @"SELECT * FROM Win32_Service WHERE Name='" + servicenameStr + @"'"; 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); 
     ManagementObjectCollection results = searcher.Get(); 
     foreach (ManagementObject service in results) 
     { 
      if (service["StartMode"].ToString() == "Disabled") 
       state = StartupState.Disabled; 
      else 
       state = StartupState.Enabled; 
     } 
     return state; 
    } 
    catch (SecurityException se) 
    { 
     return StartupState.Refused; 
    } 
    catch (Exception e) 
    { 
     return StartupState.Error; 
    } 
3

Użyj klasy ServiceController, aby uzyskać informacje o usługach.

EDIT
Wydaje jedna z tych rzeczy nie można zrobić z ServiceController jest uzyskać typ uruchamiania. Googling wykazało następujące blogu, który ma kod, który używa P/Invoke, aby uzyskać typ uruchomienia usługi: http://peterkellyonline.blogspot.de/2011/04/configuring-windows-service.html

+1

Czy odnoszą się Państwo do tego: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontrollerstatus.aspx? Jeśli tak, to mówi mi wszystko, ALE czy usługa jest wyłączona ... –

+0

Jak pisałem w mojej edycji, tak, odwołuję się do tej klasy, ale mam też na myśli dodatkowy post na blogu, który zawiera informacje o tym, jak użyj 'ServiceController' wraz z niektórymi wywołaniami natywnymi, aby uzyskać to, czego chcesz, bez uzyskiwania dostępu do rejestru. –

0

WMI może być kolejnym sposobem na odpytywanie statusu usług Windows

-3

można użyć:

using System.ServiceProcess; 

a następnie połączyć usługę chcesz zobaczyć SATUS przez:

// Link by service name 
ServiceController TheServiceName = new ServiceController(); 
TheServiceName.ServiceName = "Spooler"; 

// Link by display name 
ServiceController TheDisplayName = new ServiceController(); 
TheDisplayName.ServiceName = "Print Spooler"; 

Aby sprawdzić, na przykład stanu IsRunning:

if (TheServiceName.Status == ServiceControllerStatus.Running) 
    MessageBox.Show("The service is running."); 
+1

A jeśli usługa nie działa, to w jaki sposób ten kod powinien informować, czy jest wyłączona, czy nie? Nie wszystkie usługi, które nie są uruchomione, są wyłączone, wiesz. – ProfK

0

dodać ref do System.Management i następujący kod będzie Ci StartMode

 string wmiQuery = "SELECT * FROM Win32_Service WHERE Name='YourServiceName'"; 
     var searcher = new ManagementObjectSearcher(wmiQuery); 
     var results = searcher.Get(); 

     foreach (ManagementObject service in results) 
     { 
      Console.WriteLine(service["StartMode"]); 
     } 
+0

Dlaczego przeglądasz wyniki? Z pewnością można zainstalować tylko jedną usługę z 'YourServiceName'? – ProfK

+0

W moim projekcie WPF, który kontroluje usługę wewnątrz niestandardowego 'ServiceModel', powyższy kod po prostu zawiesza się na zawsze, kiedy próbuję iterować' wyniki'. – ProfK

0

klasa ServiceController nie dostarcza tej informacji. Powinieneś użyć WMI. Zobacz here, aby uzyskać szczegółowe rozwiązanie:

Powiązane problemy