Accueil > > > [.NET2] OBTENIR LES PROCESSUS ACTIFS DE TOUS LES COMPTES
[.NET2] OBTENIR LES PROCESSUS ACTIFS DE TOUS LES COMPTES
Information sur la source
Description
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.
Historique
- 14 septembre 2006 21:39:56 :
- Restructuration de la source (utilisation des classes)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|