![]() |
|
|||||||
| Newsgroup microsoft.public.de.german.entwickler.dotnet.csharp Forum microsoft.public.de.german.entwickler.dotnet.csharp |
![]() |
|
|
Themen-Optionen | Ansicht |
|
#1
|
|||
|
|||
|
Hallo!
Ich bin auf der Suche nach einem möglichst ressourcenschonenden Weg, mitzubekommen, ob auf dem Rechner, auf dem meine Applikation läuft, ein bestimmter Prozess (dessen Namen ich kenne) neu gestartet wird. Gibt es da etwas anderes als regelmäßig zu suchen, ob ein solcher Prozess läuft ? Das würde ich nämlich gerne vermeiden, da ich dies in sehr kurzen Abständen wiederholen müsste, es soll nämlich eigentlich verhindert werden, dass dieser Prozess überhaupt gestartet wird. Hintergrund ist, dass während einer Wartung bestimmte Programme nicht manuell vom Benutzer gestartet werden dürfen; mein Programm besitzt aber (wahrscheinlich) nicht die Rechte, die entsprechende exe einfach umzubenennen, zu löschen oder so... Danke schon mal! Michael |
|
|
||||
|
||||
|
|
|
#2
|
|||
|
|||
|
Hallo Michael,
> Ich bin auf der Suche nach einem möglichst ressourcenschonenden Weg, > mitzubekommen, ob auf dem Rechner, auf dem meine Applikation läuft, > ein bestimmter Prozess (dessen Namen ich kenne) neu gestartet wird. Nun, im Prinzip gäbe es die WMI-Klasse Win32_ProcessStartTrace, die über einen asynchronen Event einen Handler verbinden könnte. Die WMI-Beispiele benötigen aber FullTrust bei der Start-Methode: class Prozess { public static void Init() { // using System.Management / Verweis: System.Management.dll ErzeugeEvent("Win32_ProcessStartTrace"); // ErzeugeEvent("Win32_ProcessStopTrace"); } [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] private static void ErzeugeEvent(string wmiKlasse) { ManagementEventWatcher watcher = new ManagementEventWatcher( new WqlEventQuery("SELECT * FROM " + wmiKlasse)); watcher.EventArrived += new EventArrivedEventHandler( Prozess_EventArrived); watcher.Start(); } private static void Prozess_EventArrived(object sender, EventArrivedEventArgs e) { string info; if (e.NewEvent.ClassPath.Path.EndsWith("StopTrace")) info = "gestoppt"; else info = "gestartet"; MessageBox.Show("Prozess " + info + ": " + e.NewEvent.Properties["ProcessName"].Value); } } // oder: // [Using WMI to monitor process creation, deletion and modification in ..NET] // http://weblogs.asp.net/whaggard/arch...11/438006.aspx _______ Etwas ähnliches ließe sich halb-automatisiert so erreichen: - Menü/Ansicht/ServerExplorer/Server/<DeinPC>/ Verwaltungsereignisse/"Ereignisabfrage hinzufügen"/ Win32_ProcessStartTrace/Weitersuchen/OK/ RechteMaus auf "Win32_ProcessStartTrace Ereignisabfrage" / "Zum Designer hinzufügen". Im Designer managementEventWatcher1 markieren / in Eigenschaften auf das gelbe Blitz-Symbol / EventArrived Doppelklick. ________ In einem Timer je nach Anforderung der Erkennungs- Genauigkeit ein GetProcessesByName laufen zu lassen, ist auch nicht besonders aufwendig, denn es bleibt normal im 100 Millisekunden Bereich bei handelsüblichen PCs. [Process.GetProcessesByName-Methode (String) (System.Diagnostics)] http://msdn.microsoft.com/de-de/library/z3w4xdc9.aspx ________ Ansonsten würde man auf globale Hooks ausweichen, die dann aber eher auf Events des Windows des Prozesses (falls vorhanden) reagieren würden: [How to set a Windows hook in Visual C# .NET] http://support.microsoft.com/kb/318804/en-us [C#: How should I use ITaskbarList and how to detect program start?] http://www.neowin.net/forum/index.php?showtopic=637769 [Cutting Edge: Windows Hooks in the .NET Framework] http://msdn.microsoft.com/en-us/magazine/cc188966.aspx ______ Wenn es alles "Deine" Prozesse wären, hättest Du noch bessere Möglichkeiten ... aber das nehme ich mal nicht an. ciao Frank -- Dipl.Inf. Frank Dzaebel [MCP/MVP C#] http://Dzaebel.NET |
|
#3
|
|||
|
|||
|
Nachtrag ...
die (Kernelmode) Treiber-Ebene sollte nicht vergessen werden, wenn Aufwand keine Rolle spielt: [PsSetCreateProcessNotifyRoutine] http://msdn.microsoft.com/en-us/library/ms802952.aspx [PsSetCreateProcessNotifyRoutineEx] http://msdn.microsoft.com/en-us/library/bb679945.aspx [CodeProject: Detecting Windows NT/2K process execution] http://www.codeproject.com/KB/threads/procmon.aspx [Kernel Data and Filtering Support for Windows Server 2008] http://download.microsoft.com/download/4/4/b/44bb7147-f058-4002-9ab2-ed22870e3fe9/Kernal%20Data%20and%20Filtering%20Support%20for%20 Windows%20Server%202008.doc Man kann diese dann über DeviceIoControl im Usermode auch über C# ansprechen. Nur der Vollständigkeit halber, falls extreme Performance notwendig ist. ciao Frank -- Dipl.Inf. Frank Dzaebel [MCP/MVP C#] http://Dzaebel.NET |
|
#4
|
|||
|
|||
|
Hallo!
Vielen Dank für die Hinweise; da werde ich ziemlich sicher etwas finden. So extrem sind die Performance-Anforderungen nicht. Der Prozess, dessen Start ist mitbekommen möchte, gehört mir leider nicht, aber ich muss wahrscheinlich reagieren, bevor das erste Fenster dieses Prozesses erzeugt wird. Ich hoffe, dass ich dazu komme, mein Ergebnis zu posten... Danke Michael |
|
|
|
|
![]() |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Erstellt von | Forum | Antworten | Letzter Beitrag |
| Durchschnittliche CPU-Last eines Prozesses ermitteln | Bernd Hohmann | Newsgroup de.comp.os.unix.shell | 6 | 09-15-2009 03:46 PM |
| Problem mit PostQuitMessage nach dem Starten eines Explorer-Prozesses | Felix Opatz | Newsgroup de.comp.os.ms-windows.programmer | 1 | 06-15-2009 03:15 AM |
| Automatisches Starten eines Daemon-Prozesses | Rudolf Ziegaus | Newsgroup de.comp.os.unix.linux.misc | 5 | 02-23-2009 10:34 AM |
| Abstuerze eines Java-Prozesses | Mark Knobloch | Newsgroup de.comp.lang.java | 4 | 03-12-2008 08:14 AM |
| Handle eines Prozesses herausfinden und terminieren. | Thomas Steinbach | Newsgroup de.comp.os.ms-windows.programmer | 10 | 02-05-2008 11:08 AM |