2009-02-19 15 views

Respuesta

5

WMI tiene esta información: la clase Win32_Service.

consulta Un WQL como

SELECT ProcessId FROM Win32_Service WHERE Name='MyServiceName' 

usando System.Management debe hacer el truco.

De un vistazo rápido, vea: taskllist.exe /svc y otras herramientas de la línea de comandos.

4

Puede utilizar

tasklist /svc /fi "SERVICES eq YourServiceName" 

Para encontrar el nombre del proceso y de la identificación, y también si los mismos hosts procesar otros servicios.

12

Puede usar System.Management.MangementObjectSearcher para obtener la ID de proceso de un servicio y System.Diagnostics.Process para obtener la instancia correspondiente Process y matarla.

El método KillService() en el programa siguiente muestra cómo hacer esto:

using System; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Management; 

namespace KillProcessApp { 
    class Program { 
     static void Main(string[] args) { 
      KillService("YourServiceName"); 
     } 

     static void KillService(string serviceName) { 
      string query = string.Format(
       "SELECT ProcessId FROM Win32_Service WHERE Name='{0}'", 
       serviceName); 
      ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(query); 
      foreach (ManagementObject obj in searcher.Get()) { 
       uint processId = (uint) obj["ProcessId"]; 
       Process process = null; 
       try 
       { 
        process = Process.GetProcessById((int)processId); 
       } 
       catch (ArgumentException) 
       { 
        // Thrown if the process specified by processId 
        // is no longer running. 
       } 
       try 
       { 
        if (process != null) 
        { 
         process.Kill(); 
        } 
       } 
       catch (Win32Exception) 
       { 
        // Thrown if process is already terminating, 
        // the process is a Win16 exe or the process 
        // could not be terminated. 
       } 
       catch (InvalidOperationException) 
       { 
        // Thrown if the process has already terminated. 
       } 
      } 
     } 
    } 
}
+0

Buena código gracias. Sin embargo, cambiaría "if (process! = Null)" por "if (process! = Null && process.Id> 0)". Windows no te permitirá matar el proceso cero, pero es mejor ni siquiera intentarlo. Más rápido para probarlo que para levantar y atrapar una excepción. –

0

Microsoft/SysInternals tiene una herramienta de línea de comandos llamada PsKill que le permite matar a un proceso por el nombre. Esta herramienta también le permite eliminar procesos en otros servidores. Windows SysInternals

Uso: [-t] [\ equipo [-u usuario [-p contraseña]]] < ID del proceso pskill | nombrar >
      -t     matar el proceso y sus descendientes.
      -u     Especifica el nombre de usuario opcional para iniciar sesión en la computadora remota.
      -p     Especifica la contraseña opcional para el nombre de usuario. Si omite esto, se le pedirá que ingrese una contraseña oculta.

0

Supongo que es un proceso de dos pasos: si siempre es el mismo servicio, puede encontrar fácilmente el nombre del proceso utilizando los métodos sugeridos en otras respuestas.

entonces tengo el siguiente código en una clase en un servidor web .NET 1.1:

Process[] runningProcs = 
      Process.GetProcessesByName("ProcessName"); 

foreach (Process runningProc in runningProcs) 
{ 
    // NOTE: Kill only works for local processes 
    runningProc.Kill(); 
} 

El Kill method puede arrojar unas pocas excepciones que usted debe considerar la captura - en especial la Win32Exception, que se produce si el proceso no puede ser asesinado.

Tenga en cuenta que WaitForExit method y HasExited property también existen en el mundo 1.1, pero no se mencionan en la página de documentación para Kill in 1.1.

1

Para responder exactamente a mi pregunta - cómo encontrar proceso relacionado con algún servicio:

ManagementObjectSearcher searcher = new ManagementObjectSearcher 
    ("SELECT * FROM Win32_Service WHERE DisplayName = '" + serviceName + "'"); 

foreach(ManagementObject result in searcher.Get()) 
{ 
    if (result["DisplayName"].ToString().ToLower().Equals(serviceName.ToLower())) 
    { 
    int iPID = Convert.ToInt32(result["ProcessId"]); 
    KillProcessByID(iPID, 1000); //some method that will kill Process for given PID and timeout. this should be trivial 
    } 
} 

}

Cuestiones relacionadas