Mehrere gleichnamige Prozesse - Einen bestimmten ermitteln und beenden

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex.

    Mehrere gleichnamige Prozesse - Einen bestimmten ermitteln und beenden

    Hallo,
    ich habe 3 Ordner die vom Ursprung her gleich sind.
    Darin befinden sich jeweils die "TM-Server.exe"
    In jedem Order ist eine Verknüpfung zu der jeweiligen "TM-Server.exe":
    Ordner1: "TM-Server1"
    Ordner2: "TM-Server2"
    Ordner3: "TM-Server3"

    Ich starte nun alle 3 Verknüpfungen.
    Dann habe ich im Taskmanager unter Prozesse den "TM-Server.exe" Prozess 3 mal stehen, also:
    TM-Server.exe
    TM-Server.exe
    TM-Server.exe

    Wenn ich jetzt "TM-Server2" beenden will, wie finde ich heraus welcher der 3 Prozesse der gesuchte ist?

    Ich wollte den gesuchten Prozess dann mit

    Quellcode

    1. Dim p As Process = Process.GetProcessesByName("TM-Server")(0)
    2. p.CloseMainWindow()

    beenden. Aber das kann ja nicht funktionieren. Er schließt mir so nur den zum letzten Zeitpunkt göffneten.
    Kann man die Eigenschaften der Prozesse ermitteln? Oder über den "Abbildnamen" einen Proess beenden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex“ ()

    Hey Alex ;)
    Also ich schaue mir gerade den Code durch, aber das ist ganz schön starker Tobak für mich. Gibts nicht eine einfache Befehlszeile die mir die PID von dem Fenster "TM-Server1" ausgibt? Und vielleicht eine weitere die den Prozess mit dieser PID stoppt?
    Ich suche seit heute mittag nach der Lösung. So viele Lösungsansätze die ich mir in den Editor kopiert habe sind voll von blauen Wellenlinien und roten kleinen Strichen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex“ ()

    1. du kannst mit process classe alles processe aufliesten <----foren suche
    2. in schleife alle augeliestete processe durchlaufen und prüfen ob ein process mehamals geladen wurde
    Vorsicht ! Systemdateien können mehrmals geladen werden, wenn du mehrmals geladene processe durchsuchst und kilst kann zu system abstürtze führen.

    PS. Und hört auf jeder beitrag zu zetieren, das nervt langsam.....lesen kann ich selber!
    Ich glaube das wird so nichts.

    Angenommen ich
    rufe "C:\Server1\TM-Server1.bat" auf--es öffnet sich ein Fenster--"TM-Server1"--es entsteht ein Prozess--"TM-Server.exe"
    rufe "C:\Server2\TM-Server2.bat" auf--es öffnet sich ein Fenster--"TM-Server2"--es entsteht ein Prozess--"TM-Server.exe" <-den will ich stoppen
    rufe "C:\Server3\TM-Server3.bat" auf--es öffnet sich ein Fenster--"TM-Server3"--es entsteht ein Prozess--"TM-Server.exe"
    rufe "C:\Server4\TM-Server4.bat" auf--es öffnet sich ein Fenster--"TM-Server4"--es entsteht ein Prozess--"TM-Server.exe"
    rufe "C:\Server5\TM-Server5.bat" auf--es öffnet sich ein Fenster--"TM-Server5"--es entsteht ein Prozess--"TM-Server.exe"

    5 mal gleicher Prozess.
    Selbst wenn ich jetzt zu jedem Prozess die PID rausfinde z.B.
    "TM-Server.exe"="3748"
    "TM-Server.exe"="4328"
    "TM-Server.exe"="3284"
    "TM-Server.exe"="4984"
    "TM-Server.exe"="1342"

    Das bring mir nichts. Dann müsste ich die PID schon beim starten der Programme abspeichern und mit den Fenster-/Abbildnamen in verbindung bringen...
    Es kann auch sein, dass die
    "TM-Server.exe"
    "TM-Server.exe"
    "TM-Server.exe"
    "TM-Server.exe"
    "TM-Server.exe"
    schon laufen wenn ich mein Programm starte.
    Also muss ich doch vom Fensternamen oder Abbildnamen "TM-Server2" auf den Prozess und seine ID kommen.
    Ich will ja auch nicht nur alle doppelten Tasks bis auf einen stoppen. Ich möchte nur z.B. "TM-Server2" stoppen.


    P.S.: Sorry das mit dem Zitat war eher ein Fehler, habs rausgelöscht...
    Okay dann versuchen wir es mal Schritt für Schritt. Ich bin mit den Befehlen noch schlecht vertraut.

    Also wenn ich

    Quellcode

    1. Dim p() As Process = Process.GetProcessesByName("TM-Server.exe")

    eingebe dann scheint es zu funktionieren. Aber wie soll es dann weitergehen? Wie kann ich sehen ob das der Prozess von "TM-Server2" ist?
    Okay ich denke ich bin nun auf dem richtigen Weg.
    Schade dass ich so viel Zeit mit dem Suchen vertrödeln musste.
    Ich hab zwar noch nicht alles gelöst aber ich kann hiermit alle Prozesse auflisten und nebendran steht der Name des Fensters von dem es aufgerufen wurde...

    Quellcode

    1. Dim Processes As Process() = Process.GetProcesses()
    2. For Each proc As Process In Processes
    3. ListBox1.Items.Add(proc.ProcessName & " " & proc.MainWindowTitle)
    4. Next



    EDIT:
    So endlich geschafft:

    Quellcode

    1. Dim Processes As Process() = Process.GetProcesses()
    2. For Each proc As Process In Processes
    3. ' ListBox1.Items.Add(proc.ProcessName & " " & proc.MainWindowTitle) *** Brauchte ich nur zur Auflistung/Überprüfung
    4. If proc.ProcessName = "TM-Server" Then
    5. If proc.MainWindowTitle = "TM-Server1" Then
    6. Dim p As Process = Process.GetProcessesByName("TM-Server")(0)
    7. p.CloseMainWindow()
    8. End If
    9. End If
    10. Next

    So jetzt erstmal n Feierabendbierchen zur Belohnung :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Alex“ ()

    Mist. Es stimmt immer noch nicht.
    Habe das Proggy jetzt weiter ausgebaut und nach den gleichen Kriterien den Task beendet/Fenster geschlossen, bei 3 gleichnamigen Prozessen und unterschiedlichen Fensternamen. Er hat alle 3 nacheinander geschlossen. Er sollte eigentlich nur ein bestimmtes schliessen... :S
    Morgen gehts weiter... :)
    Alex: du bist schon auf dem richtigen weg:

    VB.NET-Quellcode

    1. Din intZähler As Integer = 0
    2. Dim Processes As Process() = Process.GetProcesses()
    3. For Each proc As Process In Processes
    4. If proc.ProcessName = "TM-Server" Then
    5. intZähler = intZähler + 1
    6. End If
    7. If intZähler > 1 Then
    8. Dim p As Process = Process.GetProcessesByName("TM-Server")(0)
    9. p.CloseMainWindow()
    10. End If
    11. Next
    Ne. jetzt schliesst nacheinander die "TM-Server" wie sie in der Reihenfolge im Taskmanager findet.

    Was ich erreichen will ist:

    Prozessname:-----------Fenstername:
    "TM-Server" ------------"TM-Server1"
    "TM-Server" ------------"TM-Server2" <------ Ich will z.B. nur den beenden
    "TM-Server" ------------"TM-Server3"
    "TM-Server" ------------"TM-Server4"
    "TM-Server" ------------"TM-Server5"

    Deshalb habe ich ja versucht durch eine doppelte IF Abfrage zu machen:

    Quellcode

    1. If proc.ProcessName = "TM-Server" Then
    2. If proc.MainWindowTitle = "TM-Server2" Then
    3. Dim p As Process = Process.GetProcessesByName("TM-Server")(0)
    4. p.CloseMainWindow()
    5. End If

    Aber irgendwie habe ich wohl etwas übersehen oder verstehe etwas nicht.
    Alex: für mich sied das nach sinnlose spielerei, du machst eine und die selber Anwendung 5 oder 20 mal auf, und dann willst du bestimmte instanz schliesen.
    Ich sehe in deinem Vorhaben keinen sinn und zweck. Schönes tag noch.... !


    EDIT//
    Nimm dir ein Listbox lass dort alles processe aufliesten, dann kannst du jeden bilibiegen process markieren und killen !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex2000“ ()

    Schade. Ich kann dir gerne erklären warum ich das tue.
    Ich verwalte Gameserver über einen Windows RootServer. Das alles in einem kleinen Rahmen.
    Sehr gut gehen da diese "TM-Server" (Trackmania Server - ein Autorennspiel) Da diese nicht sehr einfach zum Konfigurieren sind habe ich mir ein kleines Programm gemacht um diese besser editieren zu können, denn die TM Server Konfigurationsdateien sind im Ordnerinhalt sehr verstreut.

    Das klappt schon alles wunderbar. Nun will ich noch über dieses Programm die einzelnen Server starten bzw. stoppen zu können. Hier ein Screenshot:


    Die Server werden alle mit der "TrackmaniaServer.exe" gestartet, und heissen dann auch so im Taskmanager:


    Ich kann sie nur über die Taskleiste (was oft sehr fummelig ist) identifizieren oder eben über den Fensternamen:


    Ob mir nun jemand hilft oder nicht, hier ist auf jeden Fall das "warum" ich das versuche.
    Und ich will die "TrackmaniaServer.exe" nicht in verschiedene Namem umbenennen, weil wie gesagt noch andere Programme darauf zugreifen.
    Deshalb suche ich eine Möglichkeit den ausgewählten Server in meinem Tool per Button zu stoppen und zu starten.

    Edit:
    EDIT//
    Nimm dir ein Listbox lass dort alles processe aufliesten, dann kannst du jeden bilibiegen process markieren und killen !
    Hatte ich ja schon:

    Quellcode

    1. ' ListBox1.Items.Add(proc.ProcessName & " " & proc.MainWindowTitle) *** Brauchte ich nur zur Auflistung/Überprüfung

    Würde ich aber gerne vermeiden, weil der Server ist ja schon markiert. Also es sollte klar sein um welchen Server es sich handelt. Ich muss jetzt "nur" über den Fensternamen an den richtigen Prozess kommen um ihn abzuschalten...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Alex“ ()

    ich denke in deinem fall währe viel besser, mehrmals start der Anwendung verbieten.
    Habe hier ein Beispiel gefunden, wie sowas realisieren kannst, der Code ist zwar in VB6 geschrieben, wenn du gut drauf bist, schafst du der Code umzuschreiben.
    Das ist deine beste lösung:

    link entfernt

    Vieleicht jemand hat bessere idey !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Alex2000“ ()

    Ich habe es nun hinbekommen, es war eigentlich ganz einfach:

    ServerFensterName bekomme ich etwas früher durch den angewählten Ordner beim Starten des Programmes

    Quellcode

    1. Dim Processes As Process() = Process.GetProcessesByName("TrackmaniaServer")
    2. For Each proc As Process In Processes
    3. If proc.MainWindowTitle = ServerFensterName Then proc.Kill()
    4. 'p.CloseMainWindow()
    5. End If
    6. Next

    Trifft den gewünschten Prozess zuverlässig. Und nur den.
    Allerdings habe ich es nur mit proc.Kill() geschafft, bei p.CloseMainWindow() kommt "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." - Aber auch das bekomme ich noch hin :evil:

    Danke trotzdem für den Versuch zu helfen. Die Lösung lag auf der Hand und war eigentlich gar nicht wirklich schwer, wenn man sich mit den Befehlen etwas auskennt, was bei mir (noch) nicht der Fall ist, aber es ist noch kein Meister vom Himmel gefallen.

    Samus Aran schrieb:

    Kannst du nicht einfach überprüfen, WO die .exe des Prozesses liegt, und die so schließen? ;)
    Ja nach so einem Tipp und dem Weg wie man das umsetzt habe ich ja die ganze Zeit gesucht.
    Aber mein Weg funktioniert nun auch und zuverlässig. Habe es jetzt in allen erdenklichen Varianten getestet. Es wird ausschliesslich der Prozess gekillt der mit dem in den Anwendungen im Taskmanager übereinstimmt.
    Übrigens habe ich die Variante mit p.CloaseMainWindow() auch zum Laufen bekommen, aber die schliesst mir irgendwie manchmal auch einen anderen Prozess.
    Wie auch immer ich kann mit der härteren Kill Variante in diesem Fall gut Leben, weil man diese "TrackmaniaServer.exe" eh keine Prozedur zum Beenden haben. Also Wayne...
    Okay das eine Problem konnte ich damit zufriedenstellen lösen.

    Aber nun bin ich bei dem jeweilige Administartionstool zum Server und das startet in jedem Prozess auch im Fensternamen mit dem gleichen "C:\Windows\system32\cmd.exe" und als Prozessname steht "cmd.exe".
    also habe ich jetzt viele
    "C:\Windows\system32\cmd.exe"----"cmd.exe"
    "C:\Windows\system32\cmd.exe"----"cmd.exe"
    "C:\Windows\system32\cmd.exe"----"cmd.exe"
    "C:\Windows\system32\cmd.exe"----"cmd.exe"
    "C:\Windows\system32\cmd.exe"----"cmd.exe"

    Kann mir einer sagen wie ich den Pfad herausfinden kann, also was Samus Aran vorgeschlagen hat?
    Weil mit "proc.processname" wird mir halt nur der name und nicht der Pfad angezeigt. Und über die ID kann ich es nicht lösen.
    Der Pfad des Prozesses wäre also denke ich optimal.