Handball95
Messages postés25Date d'inscriptionvendredi 5 février 2010StatutMembreDernière intervention24 février 2010
-
11 févr. 2010 à 11:19
PapyNormand
Messages postés27Date d'inscriptionsamedi 7 août 2010StatutMembreDernière intervention16 janvier 2014
-
11 août 2010 à 15:50
Bonjour à tous.
Je développe actuellement un service qui doit pouvoir surveiller et éventuellement killer le processus de mon choix.
Le problème est que mon service doit démarrer en Local\System et qu'il ne peut donc pas accéder à tous les processus voulus... Je cherche donc désespérement des fonctions permettant de :
- surveiller le statut (ne répond pas...) d'un processus
(le paramètre Responding de la classe Process ne permettant pas de récupérer ce statut pour des processus qui ne sont pas sur le même compte) et la ligne de commande tasklist /fi "STATUS eq not responding" étant paramétrée pour les systèmes anglais uniquement - intelligents chez Windows)
- tuer un processus
Kill ne marche pas sur un processus n'utilisant pas le même compte et taskkill marche en ligne de commande mais ne veut pas marcher avec moi sous C#...
Bref, j'ai vraiment besoin de votre aide...
Pour info, je travaille sous XP. Merci d'avance...
A voir également:
Il n'y a pas de processus à l'autre extrémité du canal
PapyNormand
Messages postés27Date d'inscriptionsamedi 7 août 2010StatutMembreDernière intervention16 janvier 20141 11 août 2010 à 15:50
Bonjour,
Je réponds avec beaucoup de retard car je viens seulement de m'inscrire à Codes-Sources et je crains fort que vous ayiez laissé tomber votre problème.
1) pour ce genre de problème, il faut être administrateur du poste de travail sur lequel s'exécute le processus ( ou si on travaille sur un domaine Windows Server, être administrateur ou opérateur système )
2) la seule méthode que je connaisse fait appel à WMI ( très strict pour tous les problèmes d'accès ) voir le lien
http://msdn.microsoft.com/en-us/library/aa394372(v=VS.85).aspx il faut utiliser la propriété ExecutionState dont voici les valeurs possibles :
public enum ExecutionStateValues {
Inconnu = 0,
Autre = 1,
Prêt = 2,
En_cours_d_exécution = 3,
Bloqué = 4,
En_pause_bloqué = 5,
En_pause_prêt = 6,
Terminé = 7,
Arrêté = 8,
Agrandissement = 9,
NULL_ENUM_VALUE = 10,
}
Petit bout de code :
String p_s = "";
String p_query "SELECT * FROM Win32_Process WHERE ExecutionState 4";
ManagementObjectSearcher p_mos = new ManagementObjectSearcher(p_query);
foreach ( ManagementObject p_mo in p_mos.Get() )
{
p_s = "ProcessId : " + Convert.ToUInt32(p_mo["ProcessId]).ToString() ;
Console.WriteLine(p_s);
p_s = " Name : " + Convert.ToString(p_mo["Name"]);
Console.WriteLine(p_s);
p_s = " ExecutionPath : " + Convert.ToString(p_mo["ExecutionPath"]);
Console.WriteLine(p_s);
}
Attention vous devez ajouter une référence à System.Management et
using System.Management;
Malheureusement, ExecutionState est très mal documentée.De plus, cette propriété n'est disponible que depuis XP SP3 ( de façon partielle )