Obtenir le pid parent d'un processus

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 634 fois - Téléchargée 26 fois

Contenu du snippet

Pour obtenir le Pid (identificateur) du parent d'un processus, il y a 2 techniques :
- Passer par les APIs
- Passer par les WMI

Je vous livre ici la technique avec les APIs, car sous .Net 1.1 c'est plus simple comme ça :) (sous .net 2, les WMI c'est plus simple ;) ).

Notez qu'il ne s'agit que d'une énumération bête et méchante dans l'absolu ;o).

Source / Exemple :


using System;
using System.Runtime.InteropServices;

/// <summary>
/// Gère les processus
/// </summary>
public class ProcessManager
{
    [DllImport("kernel32.dll", SetLastError=true)]
    static extern IntPtr CreateToolhelp32Snapshot(uint dwFlags,
	  uint th32ProcessID);

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern bool Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern bool Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern bool CloseHandle(IntPtr hObject);

    /// <summary>
    /// structure d'information sur un processus
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
	  internal 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; 
    }; 

    const int TH32CS_SNAPPROCESS = 2;
    const int SIZEOF_PROCESSENTRY32 = 564;
    const int SIZE_OFFSET = 0;
    const int PROCESS_OFFSET = 8;
    const int PARENT_OFFSET = 24;

    /// <summary>
    /// Renvoi le PID du processus parent 
    /// </summary>
    /// <param name="Pid"></param>
    /// <returns></returns>
    public static uint GetParentProcess(uint Pid)
    {
	  //structure d'information sur un processus
	  PROCESSENTRY32 _pe = new PROCESSENTRY32();
	  _pe.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32));

	  //Handle pour accèder aux infos des processus
	  IntPtr handleProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

	  uint PidParent = 0;

	  try
	  {
		//Récupère la structure de processus sur le premier Handle
		bool rv = Process32First(handleProcess,ref _pe);

		if(!rv)
		     throw new Exception("Ne peut pas énumérer les processus");

		//tant qu'il y a des processus à éumérer
		while(rv)
		{
		     uint pid = _pe.th32ProcessID;
		     uint parent = _pe.th32ParentProcessID; 

		     if( pid == Pid ) //si c'est le process en cours
		     {
			   //on va renvoyer le process parent
			   PidParent = parent;
			   break; //sorti du while, on arrête d'énumérer les processus
		     }

		     //Récupère la structure de processus sur le handle suivant
		     rv = Process32Next(handleProcess, ref _pe);
		}      
	  }
	  finally
	  {
		CloseHandle(handleProcess);
	  }

	  return PidParent;
    }
}

/***********************************************************************************

                                                                                                                                                                      • /
//Utilisation uint current_pid = (uint)Process.GetCurrentProcess().Id; uint parent_pid = ProcessManager.GetParentProcess(current_pid); Process parent_process = Process.GetProcessById((int)parent_pid); string strParentFilePath = parent_process.MainModule.ModuleName;

A voir également

Ajouter un commentaire Commentaires
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
1 juin 2006 à 00:05
Malheureusement j'ai cette contrainte :o( à cause d'un p$§!??## de serveur sur NT4 (donc pas de .net 2) qu'un client ne veut pas remplacer....

Les APIs c'est quand même plus sympa à utiliser en C (rien à déclarer :D).
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
1 juin 2006 à 00:02
Toujours sympa voir du win32 avec c#.
Question : est-ce que t'as des contraintes dans ton travail qui font en sorte que vous êtes encore sur .net 1.1?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.