Event bei Starten eines bestimmten externen Prozesses

29/10/2009 - 16:21 von Michael Voss | Report spam
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
 

Lesen sie die antworten

#1 Frank Dzaebel
29/10/2009 - 20:50 | Warnen spam
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/arc...38006.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/lib...4xdc9.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.p...topicc7769

[Cutting Edge: Windows Hooks in the .NET Framework]
http://msdn.microsoft.com/en-us/mag...88966.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

Ähnliche fragen