Laden...

Prozess anhand von Parametern finden und beenden

Erstellt von tm64 vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.680 Views
T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 7 Jahren
Prozess anhand von Parametern finden und beenden

Hi Leute
ist es möglich einen Prozess zu beenden wenn man nur dessen "Befehlszeile" kennt

bsp ich habe 2 Prozesse
test.exe --username name778 --passwort pw7889
test.exe --username name332 --passwort pw7889

nun will ich einen Prozess beenden in dessen Befehlszeile das wort "name778" vorkommt

hoffe jemand versteht das Problem und kennt eine Lösung

Vielen Dank

16.828 Beiträge seit 2008
vor 7 Jahren

Erster Google Treffer =)
Find process started with arguments

771 Beiträge seit 2009
vor 7 Jahren

Hi,

meinst du mittels eines Programms oder per Hand? Im TaskManager kannst du die "Befehlszeile" als Spalte einblenden lassen und dann den entsprechenden Process beenden.

Ansonsten hilft dir evtl. folgender WMI-Code: How to get the command line parameters from a different process in C#

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 7 Jahren

ich meine mit Befehl in c#
per Hand das is schon klar 😄

@ Abt
Danke für die Antwort
Ich habe das auch schon gefunden verstehe es aber nicht ganz
bekomme da immer Fehler fehlt mir da ein "using" ?

hoffe du kennst dich da besser aus

das using System.Management; hatte ich vergessen 😄

Hinweis von Coffeebean vor 7 Jahren

Bild-Link entfernt. Bitte beachte [Hinweis] Wie poste ich richtig?

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 7 Jahren

Erster Google Treffer =)

>

kanns du mir sagen wie ich das beenden richtig eintrage ?


        private void button40_Click(object sender, EventArgs e)
        {
            var processName = "test";
            string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", processName);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery);
            ManagementObjectCollection retObjectCollection = searcher.Get();
            foreach (ManagementObject retObject in retObjectCollection)
            {
                if (retObject["CommandLine"].Equals("--password 338"))
                {
                    processName.Kill();
                }
            }
        }

Vielen Dank 😄

Hinweis von Coffeebean vor 7 Jahren

Bild-Link entfernt. Bitte beachte [Hinweis] Wie poste ich richtig?

1.029 Beiträge seit 2010
vor 7 Jahren

Hi,

Kurzform: Nett geht das über Umwege - aber vorgesehen ist es so glaube ich nicht.

Wenn's dein eigener Prozess ist: Stichwort IPC

Wenn's fremde Prozesse sind: Versuche das HauptWindow zu schließen - wenn nicht kannst du immer noch ein Kill machen.

Siehe auch: “Gracefully” killing a process

LG

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 7 Jahren

Siehe auch:
>

Vielen Dank
Leider scheint der von "Abt" verlinke Code nicht zu funktionieren oder ich mache da was falsch
habe es mit einigen Prozessen versucht werden nich gefunden

hier nochmals der Code

        private void button40_Click(object sender, EventArgs e)
        {
            var processName = "RAVCpl64";
            string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", processName);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery);
            ManagementObjectCollection retObjectCollection = searcher.Get();
            foreach (ManagementObject retObject in retObjectCollection)
            {
                if (retObject["CommandLine"].Equals("-s"))
                {
                    Global.WriteLog("Prozess gefunden");
                }
            }
        }
Hinweis von Coffeebean vor 7 Jahren

Du hast [Hinweis] Wie poste ich richtig? wohl nur überflogen 😉 Punkt 2.3 und siehe deine vorigen Beiträge

1.029 Beiträge seit 2010
vor 7 Jahren

Hi,

vorab muss ich dich um etwas mehr Bemühungen deinerseits bitten. Was du hier postet lässt nicht einmal der Compiler durch. "Funktioniert nicht" ist zudem auch keine hilfreiche Beschreibung.

Zur Lösung des Problems:

  1. Sicherstellen, dass System.Management auch tatsächlich als Verweis eingebunden ist
    (der namespace hilft dir alleine nicht)
    [Debugger benutzen!]
  2. Die WMI-Query korrekt schreiben - du solltest nicht nach "test" sondern nach "Test.exe" suchen (Wie man auch im Debugger sehen würde)
  3. In der Commandline steht deutlich mehr drin als "--password xyz" - bei mir z.B. bei Start über die Eingabeaufforderung ein komplettes "test --pasword778" - ein Equals halte ich somit nicht für zielführend
  4. Die Methode .Kill() kennt die Klasse string (zu Recht) nicht - du brauchst einen Process, den kann man sich über die Id aus dem ManagementObject holen

Hier mal als funktionierendes Beispiel:


var processName = "Test.exe";
			string wmiQuery = $"select ProcessId, CommandLine from Win32_Process where Name='{processName}'";
			var searcher = new ManagementObjectSearcher(wmiQuery);
			var retObjectCollection = searcher.Get();
			foreach (var retObject in retObjectCollection)
			{
				if (retObject["CommandLine"].ToString().EndsWith("--password 338"))
				{
					var processId = (uint)retObject["ProcessId"];
					var process = Process.GetProcessById((int)processId);
					if (!process.CloseMainWindow())
						process.Kill();
				}
			}

LG

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 7 Jahren

Vorab Vielen Dank Taipi88 für deine Hilfe
und sry wenn meine Beschreibung nicht gut war ich bin Anfänger und versuche nur irgendwie das gelöst zu bekommen 😄

  1. Sicherstellen, dass System.Management auch tatsächlich als Verweis eingebunden ist
    (der namespace hilft dir alleine nicht)

ich bin mir leider nicht ganz sicher wie ich das sicherstellen kann habe bisher immer nur oben using verwendet wie früher bei java
im verweis manager steht das drin
[Bild entfernt - Coffeebean]
reicht das aus?

  1. Die WMI-Query korrekt schreiben - du solltest nicht nach "test" sondern nach "Test.exe" suchen (Wie man auch im Debugger sehen würde)

mit .exe habe ich auch schon versucht ich dachte hald weil es in dem orginal code nicht drin war gehört es nicht hin

  1. In der Commandline steht deutlich mehr drin als "--password xyz" - bei mir z.B. bei Start über die Eingabeaufforderung ein komplettes "test --pasword778" - ein Equals halte ich somit nicht für zielführend

ich fand Equals auch nicht gut ich will eigentlich das es den prozess erkennt wenn ein bestimmtes wort drin vorkommt und nicht die ganze zeile ich denke das EndsWith ist vermutlich auch nicht das richtige , leider weiss ich nicht was man dafür benutzt "if contains" kenne ich aus java ka obs das in c gibt

ich habe jetzt einfach mal dein funktionierendes Beispiel bei mir eingefügt nur um mal zu sehen ob das geht bekomme da einen fehler angezeigt
ich hoffe du kannst mir nochmal erklähren wie ich das behebe
[Bild entfernt - Coffeebean]

danke für deine geduld 😄

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

die Syntax mit dem $-Zeichen vor dem String ist ein neues Feature von C# 6 und gibt es erst seit VS 2015. Wenn das bei Dir nicht klappt, bleib bei dem String.Format.

leider weiss ich nicht was man dafür benutzt "if contains" kenne ich aus java ka obs das in c gibt

Dann schau bitte in die Doku: String.Contains-Methode

Gruß, MarsStein

EDIT: und häng Deine Bilder hier direkt an, nicht als externe Links! Siehe [Hinweis] Wie poste ich richtig? Punkt 6.1

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo tm64,

ist mir schleierhaft, wieso du die Moderationskommentare in deinen Beiträgen ignorierst. Ich habe die Bilder wieder einmal entfernt. Die Links bekommst du per PN zugesandt, dann kannst du sie anhängen.

Bitte beachte [Hinweis] Wie poste ich richtig? (nicht nur) Punkt 6.1 !!

Gruss

Coffeebean