¿Hay alguna forma de registrarse para un evento que se dispara cuando se inicia un ejecutable de un nombre de archivo particular? Sé que es bastante fácil obtener un evento cuando sale un proceso, haciendo que el proceso se maneje y se registre para el evento salido. Pero, ¿cómo se le puede avisar cuando un proceso, que aún no se está ejecutando, comience ... sin interrogar todos los procesos en ejecución?.NET Eventos para el ejecutable de proceso start
Respuesta
podría utilizar el siguiente:
private ManagementEventWatcher WatchForProcessStart(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 10 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}
private ManagementEventWatcher WatchForProcessEnd(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceDeletionEvent " +
"WITHIN 10 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessEnded;
watcher.Start();
return watcher;
}
private void ProcessEnded(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject targetInstance = (ManagementBaseObject) e.NewEvent.Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
Console.WriteLine(String.Format("{0} process ended", processName));
}
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
Console.WriteLine(String.Format("{0} process started", processName));
}
A continuación, llamar a cualquiera WatchForProcessStart y/o WatchForProcessEnd que pasa en su nombre de proceso (por ejemplo, "notepad.exe").
El objeto ManagementEventWatcher se devuelve desde los dos métodos Watch * mientras implementa IDisposable, por lo que debe llamar a Dispose en estos objetos cuando haya terminado con ellos para evitar problemas.
También puede cambiar el valor de sondeo en las consultas si necesita que el evento se eleve más rápidamente después de que el proceso haya comenzado. Para hacer esto, cambie la línea "DENTRO DE 10" para estar dentro de algo menor que 10.
WMI puede crear eventos cuando se crean procesos. A continuación, puede filtrar estos eventos.
Un ejemplo sería bueno :) –
@ Adam: esperaba ese comentario. Desafortunadamente ha pasado un tiempo desde que trabajé con eventos de WMI (años), y no con .NET, así que tendría que aprender a hacerlo yo mismo ... y no tengo tiempo en este momento. – Richard
Aquí está el código.
Observe que debe iniciar Visual Studio como administrador para ejecutar este código.
using System;
using System.Management;
namespace AppLaunchDetector
{
class Program
{
static void Main(string[] args)
{
ManagementEventWatcher w = null;
WqlEventQuery q;
try
{
q = new WqlEventQuery();
q.EventClassName = "Win32_ProcessStartTrace";
w = new ManagementEventWatcher(q);
w.EventArrived += new EventArrivedEventHandler(ProcessStartEventArrived);
w.Start();
Console.ReadLine(); // block main thread for test purposes
}
catch (Exception ex)
{
}
finally
{
w.Stop();
}
}
static void ProcessStartEventArrived(object sender, EventArrivedEventArgs e)
{
foreach (PropertyData pd in e.NewEvent.Properties)
{
Console.WriteLine("\n============================= =========");
Console.WriteLine("{0},{1},{2}", pd.Name, pd.Type, pd.Value);
}
}
}
}
- 1. Convertir ejecutable .NET en ejecutable nativo
- 2. Ejecutar SQL Script con el ejecutable .net
- 3. start process issue
- 4. ¿Cómo establecer el nombre de proceso ejecutable de un proyecto?
- 5. .NET ejecutable process walk through
- 6. GDB adjuntándose a un proceso donde se eliminó el ejecutable
- 7. ¿Obtiene el nombre del proceso actual (ejecutable) en Go?
- 8. Herramientas para pérdidas de memoria en .Net ejecutable
- 9. Leer el registro de eventos de forma remota con .NET
- 10. ¿AppDomain es equivalente a un proceso para el código .NET?
- 11. ¿Hay un equivalente .NET de Java Web Start?
- 12. Asincronía y eventos .NET?
- 13. No se puede descompilar .NET-built ejecutable
- 14. incrustar automáticamente múltiples iconos en un .NET ejecutable
- 15. Forwarding/retransmisión de eventos .NET
- 16. Remedo de eventos en .NET
- 17. Cómo iniciar un ejecutable externo de C# y obtener el código de salida cuando el proceso termina
- 18. Obteniendo la ruta absoluta al ejecutable perl para el proceso actual
- 19. start-stop-daemon y el programa java
- 20. thread start no ejecuta run
- 21. Marco de simulación de eventos discretos para .NET
- 22. Erlang. Forma correcta para detener el proceso
- 23. Existe un límite de memoria para un solo proceso .NET
- 24. No se puede establecer LD_LIBRARY_PATH para el proceso de Java
- 25. Ganchos de eventos de VMware en .NET
- 26. Python - Problemas para construir el ejecutable
- 27. .NET gestión del manejo de eventos
- 28. .NET Error de proceso del proceso de inicio utilizando credenciales (El identificador no es válido)
- 29. .NET Proceso de inicio con mayores derechos
- 30. ¿Para qué se utiliza "java web start"?
Este código podría ser refactorizado, pero lo dejé prolijo para ayudar a comprender – Clive
Ahora ¡ESO es una respuesta! ¡Gracias! –
en realidad este código se ve bien. Pero no funciona para mí. Me falta algo? win7, proyecto de red 2.o. – Yaya