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
Unterprozess finden
BangerzZ
myCSharp.de - Member



Dabei seit:
Beiträge: 45

Themenstarter:

Unterprozess finden

beantworten | zitieren | melden

Ich hab folgendes Problem:

Ich brauche den prozess von dem ich nur den prozess habe, der den startet.

Bsp:

Mein programm startet test1.exe
test1.exe startet test2.exe
ich brauche die PID von test2.exe

Ich habe das auch schon hinbekommen nur leider geng das nur über den namen und sobalt ich den vorgang mehrmals machen will (meherer test1.exe und test2.exe laufen) funktiniert das nicht mehr weil das über den namen läuft.

Ich hoffe ihr habt verstanden was ich meine und könnt mir helfen.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.320

beantworten | zitieren | melden

Sorry, aber unter Windows gibt es keine Kind-Prozesse (wie z.B. unter Unix/Linux-Systemen), d.h. man kann nicht herausfinden, wer welchen Prozess gestartet hat.

Wenn du keinen Einfluß auf den Code von "test1" hast (d.h. daß du dir die PID von "Test2" zurückgeben lassen kannst), dann sehe ich keine Möglichkeit.
private Nachricht | Beiträge des Benutzers
mabo
myCSharp.de - Member



Dabei seit:
Beiträge: 334

beantworten | zitieren | melden

Der ProcessExplorer von Sysinternals zeigt laufende Prozesse in einer Baumstruktur an, also irgendwie muss es doch gehen.
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1.361
Herkunft: Berlin

beantworten | zitieren | melden

Hallo,

da Microsofts OS ja auch ein POSIX-kompatibles Subsystem anbietet (Subsystem for UNIX-based Applications) muss der Windows-Kernel zwangsläufig auch mit Prozess-Bäume umgehen.

Dass die normale WinApi diese Funktionalität nicht in den UserMode exportiert ist eben etwas anderes.

Es gibt zwar die ZwQueryInformationProcess, mit der man ausreichend Infos über Prozesse bekommen kann - auch die ParentProcessID - aber die Zw*** Methoden sind ja eigentlich für den Kernel-Mode bestimmt. (Dass diese Funktion mit in die WinApi übernommen wurde ist schon etwas seltsam - aber auf der msdn seite steht ja auch, dass sich das jederzeit ändern kann)

Jedenfalls: Wenn wir Informationen über unser Windows System (dann noch ausm Kernel) erhalten wollen, gibt es einen Mechanismus, der hierfür super geeignet ist - WMI.

Und so bekommen wir alle Unterprozesse:
SELECT * FROM Win32_Process WHERE ParentProcessID = <ppid>

Entweder ziehst du alle weiteren Infos auch aus dem WMI-Process-Objekt, oder du holst dir nur die ProcessID und erzeugst dir mit GetProcessById dann ein Process-Objekt.
(Kommt halt drauf an, was du überhaupt vorhast)

Hier noch ein kleines CodeSnippet, das alles nötige tut:

using System;
using System.Management;
using System.Diagnostics;
using System.Collections.Generic;

public class Sample
{
    private static IEnumerable<Process> GetChildProcesses(int ppid)
    {
        SelectQuery s = new SelectQuery();
        s.QueryString = String.Format(
            "SELECT * " +
            "FROM Win32_Process " +
            "WHERE ParentProcessID = {0}", ppid);

        ManagementObjectSearcher searcher = new ManagementObjectSearcher(s);

        List<Process> childProcesses = new List<Process>();

        foreach (ManagementObject o in searcher.Get())
        {
            int pid;
            if (Int32.TryParse(o["ProcessID"].ToString(), out pid))
            {
                Process p;
                try
                {
                    p = Process.GetProcessById((int)pid);
                    childProcesses.Add(p);
                }
                catch(ArgumentException e)
                {
                    //Der durch den processId-Parameter angegebene Prozess wird nicht (mehr) ausgeführt.
                    Console.WriteLine(e);
                }
            }
        }
        return childProcesses;
    }

    public static void Main(string[] args)
    {
        //ChildProzesse des Explorers ermitteln:
        Process parent = Process.GetProcessesByName("explorer")[0];

        Console.WriteLine("{0} ({1})", parent.ProcessName, parent.Id);


        foreach (Process child in GetChildProcesses(parent.Id))
        {
            Console.WriteLine(" \u251C-{0} ({1})", child.ProcessName, child.Id);
        }

        Console.ReadLine();
    }
}

beste Grüße
zommi
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.320

beantworten | zitieren | melden

Ok, danke zommi, wieder etwas gelernt... (also steckt in Windows intern doch ein Unix -)
private Nachricht | Beiträge des Benutzers