trova la struttura del processo in .NET

Sto cercando un modo semplice per trovare l’albero del processo (come mostrato da strumenti come Process Explorer), in C # o in un altro linguaggio .NET. Sarebbe anche utile trovare gli argomenti della riga di comando di un altro processo (StartInfo su System.Diagnostics.Process sembra non valido per il processo diverso dal processo corrente).

Penso che queste cose possano essere fatte solo invocando l’API di win32, ma sarei felice di essere smentito.

Se non vuoi P / Invoke, puoi prendere l’ID padre con un contatore delle prestazioni:

foreach (var p in Process.GetProcesses()) { var performanceCounter = new PerformanceCounter("Process", "Creating Process ID", p.ProcessName); var parent = GetProcessIdIfStillRunning((int)performanceCounter.RawValue); Console.WriteLine(" Process {0}(pid {1} was started by Process {2}(Pid {3})", p.ProcessName, p.Id, parent.ProcessName, parent.ProcessId ); } //Below is helper stuff to deal with exceptions from //looking-up no-longer existing parent processes: struct MyProcInfo { public int ProcessId; public string ProcessName; } static MyProcInfo GetProcessIdIfStillRunning(int pid) { try { var p = Process.GetProcessById(pid); return new MyProcInfo() { ProcessId = p.Id, ProcessName = p.ProcessName }; } catch (ArgumentException) { return new MyProcInfo() { ProcessId = -1, ProcessName = "No-longer existant process" }; } } 

ora basta inserirlo in qualsiasi struttura ad albero e il gioco è fatto.

Si potrebbe anche provare a cercare in WMI (class Win32_Process per esempio).

Ecco un esempio per ottenere la riga di comando di un processo tramite il suo id di processo:

  using (var mos = new ManagementObjectSearcher( "SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + pid)) { foreach (var obj in mos.Get()) { object data = obj.Properties["CommandLine"].Value; if (data != null) { Console.WriteLine("{0}: commandline = {1}", pid, data.ToString()); } } } } } 

L’ho strappato da un codice che ho scritto di recente. Per i tuoi scopi potresti usare altre tecniche (come ottenere più proprietà e / o processi contemporaneamente). Ma tu hai l’idea.

MODIFICA: l’id processo genitore, che è necessario per la costruzione dell’albero è la proprietà “ParentProcessId”, ad esempio.

Suppongo, tuttavia, che l’utilizzo dell’API Win32 sia più veloce. Si noti che non tutte le funzionalità richieste sono giustamente disponibili anche lì. Per alcune cose si dovrebbe ricorrere alla funzione (un po ‘) non supportata di NtQueryProcessInformation () o altre da NTDLL.

Non vedo perché non vuoi p / invocare. Se guardi System.Diagnostics in Reflector, vedrai che usa p / invoca internamente. Ad ogni modo, la class Process non ha un modo per recuperare il PID padre di un processo. Anziché:

La definizione della struct:

 [StructLayout(LayoutKind.Sequential)] struct PROCESS_BASIC_INFORMATION { public int ExitStatus; public int PebBaseAddress; public int AffinityMask; public int BasePriority; public int UniqueProcessId; public int InheritedFromUniqueProcessId; } 

Importazione della funzione (semplificata):

 [DllImport("ntdll.dll")] static extern int NtQueryInformationProcess( IntPtr ProcessHandle, int ProcessInformationClass, out PROCESS_BASIC_INFORMATION ProcessInformation, int ProcessInformationLength, out int ReturnLength ); 

Il codice:

 Process p = Process.GetProcessById(1234); PROCESS_BASIC_INFORMATION pbi; int size; NtQueryInformationProcess(p.Handle, 0, out pbi, Marshal.SizeOf(typeof(PROCESS_BASIC_INFORMATION)), out size); // pbi.InheritedFromUniqueProcessId now contains the process' parent PID 

Dovrai inserire questi usi nella parte superiore del tuo file:

 using System.Runtime.InteropServices; using System.Diagnostics; 

Se si desidera enumerare i processi, è preferibile utilizzare NtQuerySystemInformation, anche se il codice è un po ‘troppo lungo per essere pubblicato qui.

Sono abbastanza sicuro che avrai bisogno di usare WinAPI per questo. Vedi questo snippet di codice come esempio. Sarà un algoritmo abbastanza standard per build un albero da una lista di oggetti e dei loro oggetti genitore.