.NET - Kurze Frage zu "Prozess killen" VB 

Status
Für weitere Antworten geschlossen.

Jannik

Registered +
Registriert
Apr. 2008
Beiträge
216
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:
Code:
using System;
using System.Diagnostics;

namespace ProcessService {
public class ProcessService {
public ProcessService(){}

public static void Main( string[] args ) {
if ( args != null )
Console.WriteLine( string.Format( "Es existieren {0} Instanzen des Prozesses {1}", CheckForProcess( args[0] ), args[0] ) );
else
Console.WriteLine( "Bitte den Namen des Prozesses ohne Dateiendung angeben!" );
}

public static int CheckForProcess( string Name ){
Process[] processes;
if ( ( processes = Process.GetProcessesByName( Name ) ) != null )
return processes.Length;
return 0;
} 
}
}

Wenn Du Dir das Objekt "Prozess" anschaust, dann wirst Du dort auch die Methode "Kill" finden.
 
Zuletzt bearbeitet von einem Moderator:
Ich habs noch immer nicht richtig hinbekommen und bei der Methode "Kill" find ich auch nix sinnvolles.
 
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.

Code:
Process[] processes;
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

Code:
Process[] processes;
Process process;
processes = Process.GetProcesses();
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.

Code:
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.
 
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:

Code:
//Is C# aber die Methoden/KlassenNamen sind die Gleichen

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.ComponentModel;

namespace test
{
class Program
{
static void Main(string[] args)
{
foreach (Process x in Process.GetProcesses())
{
try
{
Console.WriteLine(x.ProcessName + "\t" + x.MainModule.FileName);
//ZUM KILLEN:
//x.Kill();
}
catch (Win32Exception) { Console.WriteLine(x.ProcessName + "\tKein Zugriff."); }
}
Console.ReadKey();
}
}
}

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

Code:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Diagnostics
Imports System.ComponentModel

Namespace test
Class Program
Private Shared Sub Main(ByVal args As String())
For Each x As Process In Process.GetProcesses()
Try
'ZUM KILLEN:
'x.Kill();
Console.WriteLine((x.ProcessName & vbTab) + x.MainModule.FileName)
Catch generatedExceptionName As Win32Exception
Console.WriteLine(x.ProcessName & vbTab & "Kein Zugriff.")
End Try
Next
Console.ReadKey()
End Sub
End Class
End Namespace

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
 
Zuletzt bearbeitet von einem Moderator:
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?
 
Zuletzt bearbeitet von einem Moderator:
Also nochmal:

Code:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Diagnostics
Imports System.ComponentModel

Namespace ProckillerCollection
Module Killer
Private Sub New()
End Sub

'Killt einen Prozess nach seinem Dateipfad. bsp: "C:\windows\explorer.exe"
'
Public Sub KillProcByFileName(ByVal Path As String)
For Each x As Process In Process.GetProcesses()
If Path = x.MainModule.FileName Then
x.Kill()
End If
Next
End Sub

'Killt einen Prozess nach seinem Namen. bsp: "explorer" (ohne ".exe")
'
Public Sub KillProcByName(ByVal PName As String)
For Each x As Process In Process.GetProcesses()
If Path = x.ProcessName Then
x.Kill()
End If
Next
End Sub
End Module
End Namespace

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
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

C
Antworten
4
Aufrufe
1K
R
Antworten
1
Aufrufe
650
Zurück
Oben Unten