2010-03-28 14 views

Antwort

60

WMI ist der einfachste Weg, dies in C# zu tun. Die Win32_Process-Klasse verfügt über die ParentProcessId-Eigenschaft. Hier ein Beispiel:

using System; 
using System.Management; // <=== Add Reference required!! 
using System.Diagnostics; 

class Program { 
    public static void Main() { 
     var myId = Process.GetCurrentProcess().Id; 
     var query = string.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", myId); 
     var search = new ManagementObjectSearcher("root\\CIMV2", query); 
     var results = search.Get().GetEnumerator(); 
     results.MoveNext(); 
     var queryObj = results.Current; 
     var parentId = (uint)queryObj["ParentProcessId"]; 
     var parent = Process.GetProcessById((int)parentId); 
     Console.WriteLine("I was started by {0}", parent.ProcessName); 
     Console.ReadLine(); 
    } 
} 

Ausgabe, wenn von Visual Studio ausgeführt wird:

ich von devenv

2

Überprüfen Sie das Mitglied th32ParentProcessID einer CreateToolhelp32Snapshot-Enumeration.

Für ein Beispiel, wie dies zu tun ist see my post here.

Da Sie C# verwenden, müssen Sie DllImports verwenden. Im verlinkten Post gibt es MSDN-Seiten für jede für die Funktionen, die Sie benötigen. Am Ende jeder MSDN-Seite haben sie den Code für DllImport für C#.

Es gibt auch einen easier way using managed Code nur, aber es funktioniert nicht, wenn Sie mehr als einen Prozessnamen von verschiedenen Anwendungen gestartet haben.

6

Wenn Sie Kontrolle über die übergeordnete Anwendung haben, können Sie das übergeordnete Element ändern, um seine PID an das untergeordnete Element zu übergeben, wenn es den Prozess startet.

+0

Einfachheit in seiner besten Form. Das ist die Antwort, nach der ich gesucht habe. – khargoosh

8

Mit Brian R. Bondy Antwort als Leitfaden gestartet wurde, als auch, was ist auf PInvoke.net, und einige Reflektor-Ausgang, habe ich dies erzeugt, für den Einsatz in LinqPad MyExtensions:

public static int ParentProcessId(this Process process) 
{ 
    return ParentProcessId(process.Id); 
} 
public static int ParentProcessId(int Id) 
{ 
    PROCESSENTRY32 pe32 = new PROCESSENTRY32{}; 
    pe32.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32)); 
    using(var hSnapshot = CreateToolhelp32Snapshot(SnapshotFlags.Process, (uint)Id)) 
    { 
     if(hSnapshot.IsInvalid) 
      throw new Win32Exception(); 

     if(!Process32First(hSnapshot, ref pe32)) 
     { 
      int errno = Marshal.GetLastWin32Error(); 
      if(errno == ERROR_NO_MORE_FILES) 
       return -1; 
      throw new Win32Exception(errno); 
     }  
     do { 
       if(pe32.th32ProcessID == (uint)Id) 
        return (int)pe32.th32ParentProcessID; 
     } while(Process32Next(hSnapshot, ref pe32)); 
    } 
    return -1; 
} 
private const int ERROR_NO_MORE_FILES = 0x12; 
[DllImport("kernel32.dll", SetLastError=true)] 
private static extern SafeSnapshotHandle CreateToolhelp32Snapshot(SnapshotFlags flags, uint id); 
[DllImport("kernel32.dll", SetLastError=true)] 
private static extern bool Process32First(SafeSnapshotHandle hSnapshot, ref PROCESSENTRY32 lppe); 
[DllImport("kernel32.dll", SetLastError=true)] 
private static extern bool Process32Next(SafeSnapshotHandle hSnapshot, ref PROCESSENTRY32 lppe); 

[Flags] 
private enum SnapshotFlags : uint 
{ 
    HeapList = 0x00000001, 
    Process = 0x00000002, 
    Thread = 0x00000004, 
    Module = 0x00000008, 
    Module32 = 0x00000010, 
    All  = (HeapList | Process | Thread | Module), 
    Inherit = 0x80000000, 
    NoHeaps = 0x40000000 
} 
[StructLayout(LayoutKind.Sequential)] 
private struct PROCESSENTRY32 
{ 
    public uint dwSize; 
    public uint cntUsage; 
    public uint th32ProcessID; 
    public IntPtr th32DefaultHeapID; 
    public uint th32ModuleID; 
    public uint cntThreads; 
    public uint th32ParentProcessID; 
    public int pcPriClassBase; 
    public uint dwFlags; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] public string szExeFile; 
}; 
[SuppressUnmanagedCodeSecurity, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort=true)] 
internal sealed class SafeSnapshotHandle : SafeHandleMinusOneIsInvalid 
{ 
    internal SafeSnapshotHandle() : base(true) 
    { 
    } 

    [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode=true)] 
    internal SafeSnapshotHandle(IntPtr handle) : base(true) 
    { 
     base.SetHandle(handle); 
    } 

    protected override bool ReleaseHandle() 
    { 
     return CloseHandle(base.handle); 
    } 

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)] 
    private static extern bool CloseHandle(IntPtr handle); 
} 
Verwandte Themen