Announcement

Collapse
No announcement yet.

Windows Services überwachen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Services überwachen

    Hallo, will einen eigenen Windows hintergrund Dienst schreiben, der in der Lage ist andere Dienste zu überwachen. Einen Windows Dienst erstellen und ihn mit einem Timer zyklische Aufgaben verrichten lassen ist kein Problem, jedoch fehlt mir die Idee wie ich einen Zusammenhang zwischen Windows Dienst und denen aus ihm gestarteten Prozessen herstellen kann.

    Also wie es möglich ist einen Prozess der im Taskmanager unter Windows2000 angezeigt wird, auf einen Dienst zurückführen zu können.

  • #2
    Hallo,

    für die Steuerung von anderen Diensten ist der SCM (<i>Service Control Manager</i>) von Windows zuständig. Im Fall des .NET Frameworks ist die <b>ServiceController</b>-Komponente für diese Zugriffe vorgesehen. Über die Methode <b>GetServices</b> kann man sich die zur Zeit auf diesem Rechner installierten Dienste zurückliefern lassen. Über die <b>Status</b>-Eigenschaft lässt sich prüfen, ob ein bestimmter Service auch zur Zeit läuft:
    <pre>
    <b>private</b> <b>void</b> Form1_Load(<b>object</b> sender, System.EventArgs e)
    {
    System.ServiceProcess.ServiceController[] aSCArray;
    aSCArray = System.ServiceProcess.ServiceController.GetService s();
    <b>foreach</b>(System.ServiceProcess.ServiceController aSC <b>in</b> aSCArray)
    {
    listBox1.Items.Add(aSC.DisplayName);
    }
    }
    <br>
    <b>private</b> <b>void</b> buttonStart_Click(<b>object</b> sender, System.EventArgs e)
    {
    serviceController1.Start();
    }
    <br>
    <b>private</b> <b>void</b> buttonStop_Click(<b>object</b> sender, System.EventArgs e)
    {
    serviceController1.Stop();
    }
    <br>
    <b>private</b> <b>void</b> buttonStatus_Click(<b>object</b> sender, System.EventArgs e)
    {
    serviceController1.Refresh();
    MessageBox.Show(serviceController1.Status.ToString ());
    }
    </pre&gt

    Comment


    • #3
      Die Vorgehensweise mit dem Service Controller ist mir bekannt, ebenso die Verwendung der Klassen Process, ProcessModule, ProcessModuleCollection usw. aus dem Namensraum System.Diagnostics

      Mir fehlt nur die Beziehungsherstellung zwischen einem Dienst und einem Prozess. Ich möchte z.B. Statistiken erstellen können wieviel Threads in einem gestarteten Dienst laufen, wieviel CPU Zeit und RAM er während seiner Laufzeit konsumiert usw.
      Gibt es eine andere Eindeutige Identifiaktion von Prozessen in Windows als die Prozess ID?
      Ein Handle evt. das ich auswerten könnte

      Comment


      • #4
        Hallo,

        ein Dienst im Prinzip nichts anderes als ein "normaler" Prozess, der allerdings <b>nicht</b> im Kontext (<i>Windows Station STA0</i>) des interaktiv angemeldeten Benutzers erzeugt wurde

        Comment


        • #5
          Ich glaube mein Problem besteht darin, dass ich keine Weg finde den Pfad bzw Namen der exe Datei zu bestimmen aus der der Service heraus gestartet wird.
          Wenn ich unter Verwaltung / Dienste / Eigenschaften nachsehe wird dort unter allgemein der Dienstname, z.B. Messenger, der Anzeigename z.B. Nachrichtendienst angezeigt.
          Beide kann ich über den ServiceController in C# ermitteln, den aufgeführten Pfad bzw Name z.B. svchost nich

          Comment


          • #6
            Hallo,

            wenn der Dienstename (wie zum Beispiel <i>Messenger</i>) bekannt ist, kann man immer noch im Schlüssel <i>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Ser vices\Messenger</i> den Eintrag <b>ImagePath</b> auslesen, um die zum Dienst gehörende ausführbare Anwendung zu ermitteln. Im Fall vom <i>Messenger</i> ist dort der Eintrag <i>%SystemRoot%\System32\svchost.exe -k netsvcs</i> zu finden

            Comment

            Working...
            X