.NET - Kurze Frage zu "Prozess killen"

  • VB

  • Jannik
  • 1978 Aufrufe 6 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • .NET - Kurze Frage zu "Prozess killen"

    Hey Leute,

    ich brauche wiedermal in eure Hilfe bei einem weiteren fast fertigen Projekt.

    Ich habe ein paar Prozess, eher Dienste, ich habe ihren Dateipfad und den Namen, mit dem sie im Task Manager unter der Registerkarte "Prozesse" angezeigt werden.

    Das Problem nun, wie kille ich die? Die Dienste haben kein Fenster, ich kann sie also nicht per Name killn und die ID weiß ich sowieso nicht, da sie beim Windowstart mitgeladen werden. ;)

    Wäre wirklich nett, wenn ihr mir helfen könntet,

    danke,

    Jannik =)
  • Hier erst mal eine Teillösung zum enumerieren:

    Quellcode

    1. using System;
    2. using System.Diagnostics;
    3. namespace ProcessService {
    4. public class ProcessService {
    5. public ProcessService(){}
    6. public static void Main( string[] args ) {
    7. if ( args != null )
    8. Console.WriteLine( string.Format( "Es existieren {0} Instanzen des Prozesses {1}", CheckForProcess( args[0] ), args[0] ) );
    9. else
    10. Console.WriteLine( "Bitte den Namen des Prozesses ohne Dateiendung angeben!" );
    11. }
    12. public static int CheckForProcess( string Name ){
    13. Process[] processes;
    14. if ( ( processes = Process.GetProcessesByName( Name ) ) != null )
    15. return processes.Length;
    16. return 0;
    17. }
    18. }
    19. }
    Alles anzeigen


    Wenn Du Dir das Objekt "Prozess" anschaust, dann wirst Du dort auch die Methode "Kill" finden.
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von wasawasa ()

  • Hmm ....
    Die Methode "kill" ist doch eigentlich recht eindeutig ...
    Wenn die Rechte passen (wie auch im Taskmanager), dann ist der Prozess weg.
    Oder ich verstehe das Problem nicht.

    Quellcode

    1. Process[] processes;
    2. processes = Process.GetProcessesByName( "Notepad" )


    Das findet die Prozessstruktur aufgrund des Namens (so wie er im Taskmanager steht. Ist dort z.B. fünf mal "Notepad", dann ist der Rückgabewert eine Liste mit fünf Einträgen

    Quellcode

    1. Process[] processes;
    2. Process process;
    3. processes = Process.GetProcesses();
    4. process = processes[1];


    Hier bekommt man erst mal die Liste aller Prozesse.
    Dann weise ich die Position 1 der ArrayList einer Variablem vom Type "Process" zu.

    Quellcode

    1. process.Kill();


    Nun ja, tut was man erwartet.

    Wenn ich da an die Zeiten vor .Net denke, in denen das alles über APIs gemacht werden musste, dann ist das Leben inzwischen richtig einfach.
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...
  • Ich habe ein paar Prozess, eher Dienste, ich habe ihren Dateipfad und den Namen, mit dem sie im Task Manager unter der Registerkarte "Prozesse" angezeigt werden.


    Hast du sie selber geschrieben?

    Wen ja:
    Bau entweder ne Abfrage ein wie: Soll ich noch weiterlaufen? (Inner Datei)
    Oder:
    Speicher die Prozess ID inner Datei ab dann kannst du sie prima auslesen.

    Als Dateispeicherort: %APPDATA%\meinprogramname\pid.txt oder so

    ansonsten:

    Quellcode

    1. //Is C# aber die Methoden/KlassenNamen sind die Gleichen
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Diagnostics;
    7. using System.ComponentModel;
    8. namespace test
    9. {
    10. class Program
    11. {
    12. static void Main(string[] args)
    13. {
    14. foreach (Process x in Process.GetProcesses())
    15. {
    16. try
    17. {
    18. Console.WriteLine(x.ProcessName + "\t" + x.MainModule.FileName);
    19. //ZUM KILLEN:
    20. //x.Kill();
    21. }
    22. catch (Win32Exception) { Console.WriteLine(x.ProcessName + "\tKein Zugriff."); }
    23. }
    24. Console.ReadKey();
    25. }
    26. }
    27. }
    Alles anzeigen


    oder Frisch aus dem C# -> VB.Net Converter:

    Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.Linq
    4. Imports System.Text
    5. Imports System.Diagnostics
    6. Imports System.ComponentModel
    7. Namespace test
    8. Class Program
    9. Private Shared Sub Main(ByVal args As String())
    10. For Each x As Process In Process.GetProcesses()
    11. Try
    12. 'ZUM KILLEN:
    13. 'x.Kill();
    14. Console.WriteLine((x.ProcessName & vbTab) + x.MainModule.FileName)
    15. Catch generatedExceptionName As Win32Exception
    16. Console.WriteLine(x.ProcessName & vbTab & "Kein Zugriff.")
    17. End Try
    18. Next
    19. Console.ReadKey()
    20. End Sub
    21. End Class
    22. End Namespace
    Alles anzeigen


    In meinProcess.MainModule.FileName steht der Dateiname, allerdings musst du aufpassen weil du bei SystemProcessen ne Exception geworfen bekommst: Kein Zugriff (auser du hast Admin bzw. SYSTEM rechte)

    Den Dateiname kannste dann vergleichen, das ist wesentlich sicherer als einfach Alle mit "MeinProcess.exe" zu killen, immerhin kann es sein das Jemand anderes auch ein Programm geschrieben hat welches diesen Dateinamen verwendet.

    mfg Phype
    Im just the cleaning man, not the signature.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von phype ()

  • Danke vielmals für die Mühe. :)

    Nein, ich habe das Programm nicht geschrieben, es ist eine Art Remoteprogramm, durch das man auf den PC zugreifen kann, diesen herunterfahren, das Internet und die Bildschirme sperren kann. Wenn ich den Prozess kille, ist dies nicht mehr möglich und genau das ist mein Ziel.

    Ich werde es morgen gleich mal ausprobieren, danke nochmal für eure Hilfe!

    Edit:\\

    Eine Frage noch? Wo genau muss ich jetzt den Prozessnamen bestimmen? In welcher Variable? Und wie genau? Soll ich den genauen Dateinamen nehmen, den Prozessnamen im Taskmanager oder was genau?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jannik ()

  • Also nochmal:

    Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.Linq
    4. Imports System.Text
    5. Imports System.Diagnostics
    6. Imports System.ComponentModel
    7. Namespace ProckillerCollection
    8. Module Killer
    9. Private Sub New()
    10. End Sub
    11. 'Killt einen Prozess nach seinem Dateipfad. bsp: "C:\windows\explorer.exe"
    12. '
    13. Public Sub KillProcByFileName(ByVal Path As String)
    14. For Each x As Process In Process.GetProcesses()
    15. If Path = x.MainModule.FileName Then
    16. x.Kill()
    17. End If
    18. Next
    19. End Sub
    20. 'Killt einen Prozess nach seinem Namen. bsp: "explorer" (ohne ".exe")
    21. '
    22. Public Sub KillProcByName(ByVal PName As String)
    23. For Each x As Process In Process.GetProcesses()
    24. If Path = x.ProcessName Then
    25. x.Kill()
    26. End If
    27. Next
    28. End Sub
    29. End Module
    30. End Namespace
    Alles anzeigen


    Du kannst einfach eine Der Methoden (KillProcByName oder KillProcByFileName) in dein Programm kopieren und dann die Methode aufrufen.

    mfg phype

    ps: Code is mal wieder aus dem C# -> VB.Net übersetzter ;P
    Im just the cleaning man, not the signature.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von phype ()