Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Prozess anhand von Parametern finden und beenden
tm64
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

Prozess anhand von Parametern finden und beenden

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

Erster Google Treffer =)
Find process started with arguments
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 771

beantworten | zitieren | melden

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#
private Nachricht | Beiträge des Benutzers
tm64
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

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

@ 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 :D
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von tm64 am .
Attachments

Moderationshinweis von Coffeebean (09.06.2016 - 14:31)

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

private Nachricht | Beiträge des Benutzers
tm64
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
Erster Google Treffer =)
Find process started with arguments

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 :D
Attachments

Moderationshinweis von Coffeebean (09.06.2016 - 14:31)

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

private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1.029
Herkunft: Mainz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tm64
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

Zitat von Taipi88
Siehe auch: “Gracefully” killing a process

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");
                }
            }
        }

Moderationshinweis von Coffeebean (09.06.2016 - 15:26)

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

private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1.029
Herkunft: Mainz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tm64
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

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 :D
Zitat
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?
Zitat
2. 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
Zitat
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
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 :D
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tm64 am .
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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.
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am .
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers