Laden...

Unterprozess finden

Erstellt von BangerzZ vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.643 Views
B
BangerzZ Themenstarter:in
45 Beiträge seit 2009
vor 14 Jahren
Unterprozess finden

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.

4.939 Beiträge seit 2008
vor 14 Jahren

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.

M
334 Beiträge seit 2007
vor 14 Jahren

Der ProcessExplorer von Sysinternals zeigt laufende Prozesse in einer Baumstruktur an, also irgendwie muss es doch gehen.

1.361 Beiträge seit 2007
vor 14 Jahren

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

4.939 Beiträge seit 2008
vor 14 Jahren

Ok, danke zommi, wieder etwas gelernt... (also steckt in Windows intern doch ein Unix -)