2012-04-30 11 views
6

Esiste un metodo .NET (C#) o una chiamata API che posso utilizzare per interrogare se un servizio di Windows è disabilitato? L'articolo MSDN pertinente is here.Si interroga se un servizio di Windows è disabilitato (senza utilizzare il registro)?

Voglio evitare di interrogare direttamente il registro. Di seguito è riportato parte del codice che sto usando in questo momento (e funziona). Comunque sto cercando qualcosa di più elegante e meno invasivo.

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

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

Ho trovato un simliar question ma speravo in una risposta migliore dal momento che le risposte sono presumibilmente obsoleti (sono passati 3 anni).

risposta

7

Questa è la sezione più pertinente del codice che ho deciso di utilizzare ... grazie per l'aiuto di tutti!

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

Utilizzare la classe ServiceController per ottenere informazioni sui servizi.

EDIT
Sembra una delle cose che non si possono fare con la ServiceController è ottenere il tipo di avvio. Googling ha mostrato il seguente post sul blog che ha codice che utilizza P/Invoke per ottenere il tipo di avvio del servizio: http://peterkellyonline.blogspot.de/2011/04/configuring-windows-service.html

+1

sono il vostro riferimento a questo: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontrollerstatus.aspx? Se è così, questo mi dice tutto MA se il servizio è disabilitato ... –

+0

Come ho scritto nel mio Edit, sì, mi riferisco a quella classe, ma mi riferisco anche a un post sul blog aggiuntivo che ha informazioni su come usa il 'ServiceController' insieme ad alcune chiamate native per ottenere ciò che vuoi senza accedere al registro. –

0

WMI può essere un altro modo per interrogare lo stato dei servizi di Windows

-3

È possibile utilizzare:

using System.ServiceProcess; 

e quindi collegare il servizio che si desidera visualizzare il satus da:

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

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

Per controllare ad esempio lo stato IsRunning:

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

E se il servizio non è in esecuzione, come dovrebbe essere detto quel codice se è disabilitato o no? Non tutti i servizi che non sono in esecuzione sono disabilitati, lo sai. – ProfK

0

Aggiungi un ref per System.Management e il seguente codice otterrà la 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

Perché si esegue il loop dei risultati? Sicuramente può essere installato un solo servizio con 'YourServiceName'? – ProfK

+0

Nel mio progetto WPF, che controlla un servizio all'interno di un 'ServiceModel' personalizzato, il codice precedente si blocca per sempre quando provo e iterate i risultati. – ProfK

0

classe ServiceController non fornisce questa informazione. Dovresti usare WMI. Vedi here per la soluzione dettagliata

Problemi correlati