Estamos utilizando un servicio de Windows mal escrito, que se bloqueará cuando intentemos detenerlo desde el código. Entonces, necesitamos encontrar qué proceso está relacionado con ese servicio y matarlo. ¿Alguna sugerencia?Averiguar el nombre del proceso de ejecución del servicio de Windows .NET 1.1
Respuesta
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.
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.
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.
}
}
}
}
}
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.
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.
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
}
}
}
- 1. Captura de pantalla del proceso en el Servicio de Windows
- 2. Averiguar el nombre del carácter Unicode en .Net
- 3. ¿Cómo obtener el ID del proceso del nombre del proceso?
- 4. Cómo ejecutar un exe del servicio de Windows y detener el servicio cuando se cierra el proceso de ejecución?
- 5. ¿Cambiar el nombre del proceso en C#?
- 6. ¿Cómo obtener el nombre del servicio de Windows desde app.config
- 7. Averiguar el nombre del procedimiento PL/SQL
- 8. Despliegue del servicio de Windows
- 9. obtener el nombre del proceso desde el proceso id (win32)
- 10. PID del último proceso en ejecución en Windows
- 11. ¿Cómo supervisar la ejecución del proceso/programa en Windows?
- 12. iniciando un proceso desde un servicio Windows .NET
- 13. Inno Setup Comprobación del proceso en ejecución
- 14. Servicio stateful de larga ejecución en .NET
- 15. Configuración del nombre del proceso en Mac OS X en tiempo de ejecución
- 16. Cambiar el nombre del proceso en Linux
- 17. Alojamiento del servicio WCF en el servicio de Windows
- 18. Detectando el nombre de usuario del proceso ID
- 19. Win32API - ¿Cómo obtener el nombre de archivo del proceso desde el control del proceso?
- 20. Proyecto de instalación del servicio de Windows: ejecute el servicio como administrador
- 21. Detectando bloqueo del proceso en .NET
- 22. Cómo averiguar el nombre del operador en Android
- 23. Comando de Windows para obtener el estado del servicio?
- 24. pid del proceso actualmente en ejecución
- 25. Nombre del procedimiento de ejecución actual
- 26. Cómo obtener el nombre del proceso en C++
- 27. Obtener el nombre del ensamblado de la aplicación web, independientemente del ensamblaje de ejecución actual
- 28. .NET Error de proceso del proceso de inicio utilizando credenciales (El identificador no es válido)
- 29. ¿Cómo cambiar el nombre del proceso java.exe/javaw.exe?
- 30. ¿Obtener el número de puerto para el nombre del servicio?
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. –