begin process at 2010 02 10 06:58:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > [.NET2] OBTENIR LES PROCESSUS ACTIFS DE TOUS LES COMPTES

[.NET2] OBTENIR LES PROCESSUS ACTIFS DE TOUS LES COMPTES


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Source .NET ( DotNet ) Classé sous :wtsenumerateprocesses, lookupaccountsid, processus, sid Niveau :Initié Date de création :14/09/2006 Date de mise à jour :14/09/2006 21:39:56 Vu / téléchargé :8 701 / 448

Auteur : Willi

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Par l'intermédiaire d'un service Windows je devais surveiller toute les x secondes si un processus tourné toujours.
Hors mon service s'éxecutant sous le compte LocalSystem, il m'était impossible de voir les processus tournant entre autres sur le compte de l'utilisateur courant.

Après plusieurs essais via différentes approches par API, j'ai fini par découvrir dans la précieuse MSDN la fonction WTSEnumerateProcesses. Et la c'est le miracle....

Ma démo vous montre donc comment utiliser cette fonction et ainsi obtenir la liste de tout les processus actifs tout comptes confondus + quelques infos basics sur ceux-ci.

Voici un extrait de la classe de wrapper.

Source

  • #region 'Variables'
  • private static bool _HasGettedProcesses;
  • private static List<ProcessInfo> _ProcessInfoCollection = new List<ProcessInfo>();
  • private static string _MatchProcessName;
  • private static int _MatchProcessID;
  • #endregion
  • #region 'Méthodes'
  • /// <summary>
  • /// Récupére les processus de tout les comptes.
  • /// </summary>
  • /// <returns>Un tableau d'objet ProcessInfo</returns>
  • public static ProcessInfo[] GetAllAccountProcesses()
  • {
  • List<ProcessInfo> piList = new List<ProcessInfo>(); //Collection recevant les objets ProcessInfo
  • IntPtr ptWTSPI = IntPtr.Zero; //Pointeur sur l'adresse mémoire du 1er bloc de données WTS_PROCESS_INFO
  • int iCount = -1; //Nombre de processus
  • //Obtient l'adresse du 1er bloc de données WTS_PROCESS_INFO + nombre de processus
  • bool bret = WTSEnumerateProcesses((IntPtr)WTS_CURRENT_SERVER_HANDLE, 0, 1, ref ptWTSPI, ref iCount);
  • //Si tout va bien
  • if (bret)
  • {
  • //Itération sur l'ensemble des processus.
  • for (int i = 0; i < iCount; i++)
  • {
  • WTS_PROCESS_INFO PrcInfo = new WTS_PROCESS_INFO(); //Nouvelle instance WTS_PROCESS_INFO recevant le bloc de données
  • //Récupération des données du bloc à l'adresse du pointeur.
  • PrcInfo = (WTS_PROCESS_INFO)Marshal.PtrToStructure(ptWTSPI, typeof(WTS_PROCESS_INFO));
  • int iPID = PrcInfo.ProcessId; //ID du processus
  • int iPSession = PrcInfo.SessionId; //ID de la session
  • string szAccount = "", szDomain = ""; //Compte et domaine du SID
  • SID_NAME_USE sidCat = new SID_NAME_USE(); //Type du SID
  • //Récupération du nom du processus.
  • string szProcessName = Marshal.PtrToStringAuto(PrcInfo.pProcessName);
  • //Récupération du compte + domaine + type du SID.
  • InfoFromSID(PrcInfo.pUserSid, ref szAccount, ref szDomain, ref sidCat);
  • //Ajoute à la collection un objet ProcessInfo contenant les infos précédentes.
  • piList.Add(new ProcessInfo(iPID, iPSession, szProcessName, szAccount, szDomain, sidCat.ToString()));
  • //Avance le pointeur vers l'adresse du bloc de données suivant.
  • ptWTSPI = (IntPtr)(ptWTSPI.ToInt32() + Marshal.SizeOf(typeof(WTS_PROCESS_INFO)));
  • }
  • }
  • //Libère la mémoire allouée
  • WTSFreeMemory(ptWTSPI);
  • //Remplie la collection globale
  • _ProcessInfoCollection = piList;
  • //Flag à true indiquant que la liste à été récupérer au moins une fois
  • _HasGettedProcesses = true;
  • //Retourne un tableau ProcessInfo
  • return piList.ToArray();
  • }
  • /// <summary>
  • /// Récupère les informations sur un processus à partir de son nom.
  • /// </summary>
  • /// <param name="processname">Nom du processus.</param>
  • /// <returns>Objet ProcessInfo.</returns>
  • public static ProcessInfo RetrieveProcessInfo(string processname)
  • {
  • if (!_HasGettedProcesses)
  • GetAllAccountProcesses();
  • _MatchProcessName = processname;
  • return _ProcessInfoCollection.Find(MatchInfoFromProcessName);
  • }
  • /// <summary>
  • /// Récupère les informations sur un processus à partir de son PID.
  • /// </summary>
  • /// <param name="processname">PID du processus.</param>
  • /// <returns>Objet ProcessInfo.</returns>
  • public static ProcessInfo RetrieveProcessInfo(int pid)
  • {
  • //Si pas encore récupéré la liste des processus
  • if (!_HasGettedProcesses)
  • GetAllAccountProcesses();
  • _MatchProcessID = pid;
  • return _ProcessInfoCollection.Find(MatchInfoFromPID);
  • }
  • #endregion
  • #region 'Méthodes privées'
  • /// <summary>
  • /// Cherche l'objet ProcessInfo suivant son nom de processus.
  • /// </summary>
  • /// <param name="pi">Objet ProcessInfo de recherche.</param>
  • /// <returns>True si trouvé; False si non.</returns>
  • private static bool MatchInfoFromProcessName(ProcessInfo pi)
  • {
  • if (pi.ProcessName.Equals(_MatchProcessName))
  • return true;
  • else
  • return false;
  • }
  • /// <summary>
  • /// Cherche l'objet ProcessInfo suivant son PID.
  • /// </summary>
  • /// <param name="pi">Objet ProcessInfo de recherche.</param>
  • /// <returns>True si trouvé; False si non.</returns>
  • private static bool MatchInfoFromPID(ProcessInfo pi)
  • {
  • if (pi.Pid.Equals(_MatchProcessID))
  • return true;
  • else
  • return false;
  • }
  • /// <summary>
  • /// Obtient des infos sur un SID
  • /// </summary>
  • /// <param name="SID">Pointeur SID.</param>
  • /// <param name="account">Retourne le nom du compte.</param>
  • /// <param name="domain">Retourne le domaine.</param>
  • ///<param name="category">Retourne le type du SID.</param>
  • private static void InfoFromSID(IntPtr SID, ref string account, ref string domain, ref SID_NAME_USE category)
  • {
  • //Recevra le compte et le domaine.
  • StringBuilder szbName = new StringBuilder();
  • StringBuilder szbDomain = new StringBuilder();
  • //Longeur des chaines retournées.
  • int iSizeName = 0;
  • int iSizeDomain = 0;
  • //Recevra le type de SID.
  • SID_NAME_USE sidUse = new SID_NAME_USE();
  • //1er appel afin d'obtenir la longeur des chaines de caractères du compte et du domaine.
  • bool bret = LookupAccountSid(null, SID, szbName, ref iSizeName, szbDomain, ref iSizeDomain, out sidUse);
  • //Nouvelle instances des StringBuilder dimensionnées.
  • szbName = new StringBuilder(iSizeName);
  • szbDomain = new StringBuilder(iSizeDomain);
  • //2nd appel pour remplir szbName, szbDomain et sidUse
  • bret = LookupAccountSid(null, SID, szbName, ref iSizeName, szbDomain, ref iSizeDomain, out sidUse);
  • //Retourne les valeurs
  • account = szbName.ToString();
  • domain = szbDomain.ToString();
  • category = sidUse;
  • }
  • #endregion
        #region 'Variables'

        private static bool _HasGettedProcesses;
        private static List<ProcessInfo> _ProcessInfoCollection = new List<ProcessInfo>();
        private static string _MatchProcessName;
        private static int _MatchProcessID;

        #endregion


        #region 'Méthodes'

        /// <summary>
        /// Récupére les processus de tout les comptes.
        /// </summary>
        /// <returns>Un tableau d'objet ProcessInfo</returns>
        public static ProcessInfo[] GetAllAccountProcesses()
        {
            List<ProcessInfo> piList = new List<ProcessInfo>();     //Collection recevant les objets ProcessInfo
            IntPtr ptWTSPI = IntPtr.Zero;                           //Pointeur sur l'adresse mémoire du 1er bloc de données WTS_PROCESS_INFO
            int iCount = -1;                                        //Nombre de processus

            //Obtient l'adresse du 1er bloc de données WTS_PROCESS_INFO + nombre de processus
            bool bret = WTSEnumerateProcesses((IntPtr)WTS_CURRENT_SERVER_HANDLE, 0, 1, ref ptWTSPI, ref iCount);

            //Si tout va bien
            if (bret)
            {
                //Itération sur l'ensemble des processus.
                for (int i = 0; i < iCount; i++)
                {
                    WTS_PROCESS_INFO PrcInfo = new WTS_PROCESS_INFO();  //Nouvelle instance WTS_PROCESS_INFO recevant le bloc de données

                    //Récupération des données du bloc à l'adresse du pointeur.
                    PrcInfo = (WTS_PROCESS_INFO)Marshal.PtrToStructure(ptWTSPI, typeof(WTS_PROCESS_INFO));

                    int iPID = PrcInfo.ProcessId;                   //ID du processus
                    int iPSession = PrcInfo.SessionId;              //ID de la session
                    string szAccount = "", szDomain = "";           //Compte et domaine du SID
                    SID_NAME_USE sidCat = new SID_NAME_USE();       //Type du SID

                    //Récupération du nom du processus.
                    string szProcessName = Marshal.PtrToStringAuto(PrcInfo.pProcessName);

                    //Récupération du compte + domaine + type du SID.
                    InfoFromSID(PrcInfo.pUserSid, ref szAccount, ref szDomain, ref sidCat);

                    //Ajoute à la collection un objet ProcessInfo contenant les infos précédentes.
                    piList.Add(new ProcessInfo(iPID, iPSession, szProcessName, szAccount, szDomain, sidCat.ToString()));

                    //Avance le pointeur vers l'adresse du bloc de données suivant.
                    ptWTSPI = (IntPtr)(ptWTSPI.ToInt32() + Marshal.SizeOf(typeof(WTS_PROCESS_INFO)));
                }
            }

            //Libère la mémoire allouée
            WTSFreeMemory(ptWTSPI);

            //Remplie la collection globale
            _ProcessInfoCollection = piList;

            //Flag à true indiquant que la liste à été récupérer au moins une fois
            _HasGettedProcesses = true;

            //Retourne un tableau ProcessInfo
            return piList.ToArray();
        }

        /// <summary>
        /// Récupère les informations sur un processus à partir de son nom.
        /// </summary>
        /// <param name="processname">Nom du processus.</param>
        /// <returns>Objet ProcessInfo.</returns>
        public static ProcessInfo RetrieveProcessInfo(string processname)
        {
            if (!_HasGettedProcesses)
                GetAllAccountProcesses();

            _MatchProcessName = processname;

            return _ProcessInfoCollection.Find(MatchInfoFromProcessName);
        }

        /// <summary>
        /// Récupère les informations sur un processus à partir de son PID.
        /// </summary>
        /// <param name="processname">PID du processus.</param>
        /// <returns>Objet ProcessInfo.</returns>
        public static ProcessInfo RetrieveProcessInfo(int pid)
        {
            //Si pas encore récupéré la liste des processus
            if (!_HasGettedProcesses)
                GetAllAccountProcesses();

            _MatchProcessID = pid;

            return _ProcessInfoCollection.Find(MatchInfoFromPID);
        }

        #endregion


        #region 'Méthodes privées'

        /// <summary>
        /// Cherche l'objet ProcessInfo suivant son nom de processus.
        /// </summary>
        /// <param name="pi">Objet ProcessInfo de recherche.</param>
        /// <returns>True si trouvé; False si non.</returns>
        private static bool MatchInfoFromProcessName(ProcessInfo pi)
        {
            if (pi.ProcessName.Equals(_MatchProcessName))
                return true;
            else
                return false;
        }

        /// <summary>
        /// Cherche l'objet ProcessInfo suivant son PID.
        /// </summary>
        /// <param name="pi">Objet ProcessInfo de recherche.</param>
        /// <returns>True si trouvé; False si non.</returns>
        private static bool MatchInfoFromPID(ProcessInfo pi)
        {
            if (pi.Pid.Equals(_MatchProcessID))
                return true;
            else
                return false;
        }

        /// <summary>
        /// Obtient des infos sur un SID
        /// </summary>
        /// <param name="SID">Pointeur SID.</param>
        /// <param name="account">Retourne le nom du compte.</param>
        /// <param name="domain">Retourne le domaine.</param>
        ///<param name="category">Retourne le type du SID.</param>
        private static void InfoFromSID(IntPtr SID, ref string account, ref string domain, ref SID_NAME_USE category)
        {
            //Recevra le compte et le domaine.
            StringBuilder szbName = new StringBuilder();
            StringBuilder szbDomain = new StringBuilder();

            //Longeur des chaines retournées.
            int iSizeName = 0;
            int iSizeDomain = 0;

            //Recevra le type de SID.
            SID_NAME_USE sidUse = new SID_NAME_USE();

            //1er appel afin d'obtenir la longeur des chaines de caractères du compte et du domaine.
            bool bret = LookupAccountSid(null, SID, szbName, ref iSizeName, szbDomain, ref iSizeDomain, out sidUse);

            //Nouvelle instances des StringBuilder dimensionnées.
            szbName = new StringBuilder(iSizeName);
            szbDomain = new StringBuilder(iSizeDomain);

            //2nd appel pour remplir szbName, szbDomain et sidUse
            bret = LookupAccountSid(null, SID, szbName, ref iSizeName, szbDomain, ref iSizeDomain, out sidUse);

            //Retourne les valeurs
            account = szbName.ToString();
            domain = szbDomain.ToString();
            category = sidUse;
        }

        #endregion

 Conclusion

Commentaires, notes
merci de juger :)

Bon dév.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

14 septembre 2006 21:39:56 :
Restructuration de la source (utilisation des classes)

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) EXPLORER LA MFT D'UNE PARTITION NTFS
Source avec Zip Source avec une capture Source .NET (Dotnet) IPHELPER - PORTS TCP/UDP, TABLES DE ROUTAGE/ARP + FONCTIONS ...
Source avec Zip Source avec une capture Source .NET (Dotnet) PREVIEW HANDLER POUR OFFICE OUTLOOK 2007/10 SUR LES FICHIERS...
Source avec Zip Source avec une capture Source .NET (Dotnet) TEAM FOUNDATION SERVER - EXPLOITER LA PARTIE CLIENTE.
Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET3.5] SYSTEM.IO.PIPES - UTILISATION D'UN CANAL NOMMÉ

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE L'API VIRTUAL DISK IMAGE DE WINDOWS 7 par Willi
Source avec Zip Source .NET (Dotnet) CHESS GAME CORE - LIBRAIRIE JEU D'ÉCHEC EN C# par Bidou
Source .NET (Dotnet) CHANGER LA RESOLUTION DE VOTRE ECRAN, UTILISATION DES API WI... par mechtaly
Source avec Zip Source .NET (Dotnet) CRÉER SON PROPRE DESIGNER COMME CELUI DE VISUAL STUDIO par ShareVB
Source avec Zip Source .NET (Dotnet) CSVSHARP. DLL D'IMPORT/EXPORT DE CONTENU AU FORMAT CSV par heriquet

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) INSTANCE UNIQUE + COMMUNICATION DE MESSAGES (COMPATIBLE 32 E... par taupe4
Source avec Zip Source .NET (Dotnet) LISTER LES HANDLES (FICHIERS, CLÉ DE REGISTRES,...) OUVERTS ... par ShareVB
Source .NET (Dotnet) OBTENIR LE PID PARENT D'UN PROCESSUS par poppyto
Source .NET (Dotnet) COMPTEURPROCESSUS : CONTROLER LA DUREE D'UTILISATION D'UNE A... par zinzin61
Source avec Zip Source avec une capture Source .NET (Dotnet) LANCER UN PROCESSUS À L'ENDROIT DÉSIRÉ DE L'ECRAN par darktoto

Commentaires et avis

Commentaire de leprov le 14/09/2006 14:06:11

sympa pour montrer l'explication mais (avis perso) :
-tout dans le main, et meme tout dans la classe du main, j'accroche pas des masses.
-a mon sens, le code de récupération des process aurait du etre dans un objet a part qui mette a disposition une méthode permettant de récupérer les process, avec le wrapping des API dans cette classes (et donc un main qui contienne un truc du genre :
List<ObjetsDeTypeDetailProcess> ListMonObjet= ObjetsDeTypeDetailProcess.RecupListProcess();
foreach(ObjetsDeTypeDetailProcess MonObjet in ListMonObjet)
Console.Writeling(blablabla);

bref, un code un peu plus objet (et qui permette a qqun qui veut utiliser ta source de juste prendre une classe et de l'utiliser, et pas d'avoir a tout épurer avec ton code dispersé dans le main, dans des méthodes, etc....).

sinon le code est clair, commenté, et l'utilisation de cette API est plutot interessante, (je regrette juste le copié collé des commentaires de la doc, un peu d'épuration et des commentaires unifiés dans la langue auraient été plus sympas, mais je chipote ;)).

bref, a part la structure qui est perfectible, c'est plutot pas mal ;)

Commentaire de Willi le 14/09/2006 14:24:16 administrateur CS

LEPROV,
A la base c'était juste un projet "brouillon" pour essayer différentes méthodes donc oui c'est pas trop objet. Voila pourquoi tout est dans le Main.
Mais je prend note pour le rendre "plus" objet, je vais mettre à jour dès que possible.

Pour le copier-coller de la doc oui je sais c'est pas tip-top je vais simplifier et françiser tout ca.

Merci.

Commentaire de sebmafate le 14/09/2006 15:44:13 administrateur CS

je suis du même avis que leprov... CodeS-SourceS n'est pas un recueil de brouillons.
Merci de faire un minimum d'efforts pour que ta source soit compréhensible et réutilisable.

Commentaire de Willi le 14/09/2006 21:45:29 administrateur CS

Efforts fait. Source mise à jour.
Voila j'attend vos nouveaux commentaire maintenant sur la classe de wrapper :)

Commentaire de sebmafate le 15/09/2006 06:09:42 administrateur CS

nickel :)

Commentaire de meteors le 15/09/2006 08:55:44

Je dis surement une connerie parce que je n'ai pas pris le temps de vérifier, mais ne peut ont pas faire cela en WMI? genre avec Win32_process connecté sur le pc distant? bien sûr, cela requiert je pense d'avoir un domaine qui ne soit pas trop vieux (genre NT4 SP6 minimum et sans millenium et 98 et 95)

Commentaire de Willi le 15/09/2006 23:08:50 administrateur CS

Si bien sur et tu as de nombreuses infos supplémentaire mais rien ne te renseigne sur le compte executant le processus, ni le domaine du compte.

Commentaire de Handball95 le 09/02/2010 15:46:40 10/10

Ton programme me sauve la vie, après quasiment trois jours de recherche intensive :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Boucle des messages de processus [ par bob94700 ] Bonjour, Je souhaiterais savoir s'il est possible de :- envoyer des messages (ou des séquences de touches) à un processus donné- détecter les messag Retrouvé le processus actif [ par bob94700 ] Bonjour, Je chercher à retrouver le programme actuellement actif (la fenètre qui a le focus). Pour cela, j'ai pu utiliser la fonction de l'API : Get Status de fichier [ par SharpMao ] Salut à tous,Est-ce que quelqu'un sait si il y a un moyen de savoir si un fichier est actuellement ouvert en écriture par un autre processus? Je m'exp [c#]Detection processus [ par karshnod ] Bonjour,Est il possible de savoir si une application est deja lancé, afin qu'on ne puisse la lancer 2 fois ?merci la classe Musique [ par Online ] Voila un nouveau petit probleme.J'ai implémenté la classe Musique dans mon application Pour rappelil se trouve que j'ai aussi un tagger et que des que Appeler 2 processus 16 bits dans une meme fenetre dos [ par actif95 ] Bonsoir,mon problème est le suivant :j'ai besoin d'exécuter 2 processus 16 bits dans une même fenetre dos,le 1er étant appelé une seule fois (nécessai lancer un processus en arriere plan en C# [ par defflava ] je veux réaliser un programme qui permet de lancer un processus permanenet en arriere plan qui detecte le changement dans un fichier texte. le progra utilisation cpu par processus [ par Adidas2 ] Salut tous le mondeJe cherche à obtenir l'utilisation CPU de chaque processus lancé quelqu'un aurait une idée de la fonction à utiliser svp ?Langage : nouveau processus + arguments [ par shiva54 ] Bonjour,Je cherche à lancer un processus et à lui passer des arguments.Tout d'abord il faut savoir que le programme accept des arguments.Mon problème Appel de méthode d'un processus [ par SharpMao ] Hello,Voici mon probème : J'ai un service Web qui doit faire des opérations longues. J'aimerais pouvoir créer un processus indépendant, et que le serv


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales