2012-03-22 15 views
6

Estoy trabajando en un programa de instalación para uno de los productos de mi compañía. El producto se puede instalar varias veces y cada instalación representa un servicio de Windows por separado. Cuando los usuarios actualicen o reinstalen el programa, me gustaría buscar los servicios en ejecución, encontrar los servicios que pertenecen al producto y luego encontrar el archivo ejecutable y su ruta para ese servicio. Luego use esa información para encontrar cuál de los servicios desea actualizar/reemplazar/instalar/etc. En el siguiente ejemplo de código, veo el nombre del servicio, la descripción, etc., pero no veo el nombre de archivo o la ruta real. ¿Podría alguien decirme qué me estoy perdiendo? ¡Gracias de antemano!encontrar el ejecutable real y la ruta asociada a un servicio de Windows usando C#

El código que tengo es el siguiente:

 ServiceController[] scServices; 
     scServices = ServiceController.GetServices(); 

     foreach (ServiceController scTemp in scServices) 
     { 
      if (scTemp.ServiceName == "ExampleServiceName") 
      { 
       Console.WriteLine(); 
       Console.WriteLine(" Service :  {0}", scTemp.ServiceName); 
       Console.WriteLine(" Display name: {0}", scTemp.DisplayName); 

       ManagementObject wmiService; 
       wmiService = new ManagementObject("Win32_Service.Name='" + scTemp.ServiceName + "'"); 
       wmiService.Get(); 
       Console.WriteLine(" Start name:  {0}", wmiService["StartName"]); 
       Console.WriteLine(" Description:  {0}", wmiService["Description"]); 
      } 
     } 
+1

Puede usar WMI o el registro. Eche un vistazo a [esta pregunta] (http://stackoverflow.com/questions/2728578/how-to-get-phyiscal-path-of-windows-service-using-net). – Gene

+0

¡Impresionante! ¡Gracias Gene! Utilizando mi ejemplo anterior y el enlace que publicó, pude hacer lo siguiente: wmiService.GetPropertyValue ("PathName"). ToString() que devolvió la ruta completa y el nombre de archivo del programa que se está exedutando – Aaron

Respuesta

9

Puedo estar equivocado, pero la clase ServiceController no proporciona esa información directamente.

Por lo que sugiere Gene - tendrá que usar el registro o WMI.

Para un ejemplo de cómo utilizar el registro, consulte http://www.codeproject.com/Articles/26533/A-ServiceController-Class-that-Contains-the-Path-t

Si decide utilizar WMI (que yo prefiero),

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service"); 
ManagementObjectCollection collection = searcher.Get(); 

foreach (ManagementObject obj in collection) 
{  
    string name = obj["Name"] as string; 
    string pathName = obj["PathName"] as string; 
    ... 
} 

Usted puede decidir para envolver las propiedades que necesita en una clase.

Cuestiones relacionadas