Gibt es eine Möglichkeit, sich für ein Ereignis zu registrieren, das ausgelöst wird, wenn eine ausführbare Datei eines bestimmten Dateinamens gestartet wird? Ich weiß, dass es einfach ist, ein Ereignis zu erhalten, wenn ein Prozess beendet wird, indem das Prozesshandle abgerufen und für das beendete Ereignis registriert wird. Aber wie kann man benachrichtigt werden, wenn ein Prozess, der noch nicht läuft, gestartet wird ... ohne alle laufenden Prozesse abzufragen?.NET-Ereignisse für den ausführbaren Prozessprozess
Antwort
könnten Sie Folgendes verwenden:
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));
}
Sie würden dann entweder WatchForProcessStart und/oder WatchForProcessEnd im Prozessnamen (zB "notepad.exe"), die nennen.
Das ManagementEventWatcher-Objekt wird von den beiden Watch * -Methoden zurückgegeben, da IDisposable implementiert wird. Daher sollten Sie Dispose für diese Objekte aufrufen, wenn Sie damit fertig sind, um Probleme zu vermeiden.
Sie können den Abfragewert in den Abfragen auch ändern, wenn das Ereignis nach dem Start des Prozesses schneller ausgelöst werden soll. Um dies zu tun, ändern Sie die Zeile "WITHIN 10" in etwas weniger als 10 sein.
WMI kann Ereignisse erstellen, wenn Prozesse erstellt werden. Sie könnten diese Ereignisse dann filtern.
Ein Beispiel wäre nett :) –
@Adam: Ich habe diesen Kommentar erwartet. Leider ist es schon eine Weile her, dass ich mit WMI-Events (Jahren) gearbeitet habe, und nicht mit .NET, also müsste ich lernen, wie ich es selbst mache ... und momentan keine Zeit habe. – Richard
Hier ist Code.
Beachten Sie, dass Sie Visual Studio wie Administrator starten müssen, um diesen Code auszuführen.
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. Erstellen einer ausführbaren Datei mit Maven für den Frühling
- 2. Wie finde ich den aktuellen ausführbaren Dateinamen?
- 3. Vergleichen von generierten ausführbaren Dateien für Äquivalenz
- 4. Name der ausführbaren Anwendung unterscheidet sich von vshost ausführbaren Namen
- 5. Kann ich den Prozess nach ausführbaren Namen behandeln?
- 6. Verschlüsselung einer ausführbaren Datei
- 7. Push eines ausführbaren Funktionszeigers?
- 8. Wie bekomme ich den Quellcode einer ausführbaren Windows-Datei?
- 9. Powershell-Skript, um den Binär-Typ einer ausführbaren Datei zurückzugeben?
- 10. Speicherlayout der ausführbaren Datei
- 11. gprof und Argumente ausführbaren
- 12. Windows Lua zu ausführbaren
- 13. Pyinstaller- einschließlich Vermögenswerte in ausführbaren
- 14. Ändern Sie einfach den Namen der ausführbaren App für eine iPhone App
- 15. ELF - Überprüfen der ausführbaren Speicherbereiche
- 16. Std :: Liste der ausführbaren Funktionen?
- 17. lesen thumbprint einer ausführbaren \ process
- 18. Stoppen einer ausführbaren JAR-Datei
- 19. Erstellen von ausführbaren Dateien für Python 3 und PyQt
- 20. Einheit Pfad kompiliert in ausführbaren
- 21. Welche Sicherheitsrisiken bestehen bei ausführbaren Berechtigungen für Dateien in Linux?
- 22. Kompilieren Swift-Code zu nativen ausführbaren Dateien für Linux
- 23. Erstellen von ausführbaren Dateien von Labview für Linux-basierte Platform
- 24. Ermitteln des ausführbaren C-Namens
- 25. Erstellen einer ausführbaren JAR-Datei
- 26. kwargs in ausführbaren Python-Dateien
- 27. JUnit und junit.framework.TestSuite - Keine ausführbaren Methoden
- 28. Vollständige Disassemblierung einer ausführbaren Binärdatei erhalten
- 29. Programmatisch das Symbol der ausführbaren Datei ändern
- 30. Wrap-Dateien in einem ausführbaren Paket
Dieser Code könnte refaktoriert werden, aber ich habe es ausführlich gelassen, um das Verständnis zu erleichtern – Clive
Nun, das ist eine Antwort! Vielen Dank! –
eigentlich sieht dieser Code gut aus. Aber es funktioniert nicht für mich. Ich vermisse jeden Punkt? win7, net 2.o project. – Yaya