2012-04-30 6 views
6

¿Existe un método .NET (C#) o una llamada API que pueda usar para consultar si un servicio de Windows está deshabilitado? El artículo relevante de MSDN is here.¿Pregunta si un servicio de Windows está deshabilitado (sin usar el registro)?

Quiero evitar consultar el registro directamente. A continuación se muestra parte del código que estoy usando en este momento (y funciona). Sin embargo, estoy buscando algo más elegante y menos invasivo.

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

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

Lo que encontrar un simliar question pero yo estaba esperando para una mejor respuesta, ya que las respuestas son supuestamente obsoleta (3 años han pasado).

Respuesta

7

Esta es la sección más relevante del código que decidí usar ... ¡gracias por la ayuda!

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

Use la clase ServiceController para obtener información sobre los servicios.

EDITAR
Parece una de las cosas que no puede hacer con el ServiceController es conseguir el tipo de inicio. Buscar en Google mostró la siguiente entrada de blog que tiene el código que utiliza P/Invoke para obtener el tipo de inicio del servicio: http://peterkellyonline.blogspot.de/2011/04/configuring-windows-service.html

+1

su está refiriendo a esto: http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontrollerstatus.aspx? Si es así, eso me dice todo PERO si el servicio está deshabilitado ... –

+0

Como escribí en mi Edición, sí, me refiero a esa clase, pero también me refiero a una publicación de blog adicional que contiene información sobre cómo utilice el 'ServiceController' junto con algunas llamadas nativas para obtener lo que desea sin tener que acceder al registro. –

0

WMI puede ser otra manera para consultar el estado de los servicios de las ventanas

-3

que puede utilizar:

using System.ServiceProcess; 

y vincular los servicios que desea ver la satus por:

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

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

Para comprobar, por ejemplo, el Estado isRunning:

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

Y si el servicio no se está ejecutando, ¿cómo se supone que ese código le dirá si está deshabilitado o no? No todos los servicios que no están en ejecución están deshabilitados, ¿sabe? – ProfK

0

Añadir un árbitro System.Management y el siguiente código le dará el 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

¿Por qué revisas los resultados? Seguramente solo se puede instalar un servicio con 'YourServiceName' – ProfK

+0

En mi proyecto WPF, que controla un servicio dentro de un 'ServiceModel' personalizado, el código anterior simplemente se cuelga para siempre cuando intento iterar' results'. – ProfK

0

clase ServiceController no proporciona esta información. Deberías usar WMI. Ver here para la solución detallada

Cuestiones relacionadas