Statuts processus Windows

Handball95 Messages postés 25 Date d'inscription vendredi 5 février 2010 Statut Membre Dernière intervention 24 février 2010 - 11 févr. 2010 à 11:19
PapyNormand Messages postés 27 Date d'inscription samedi 7 août 2010 Statut Membre Dernière intervention 16 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...

2 réponses

Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
26 mars 2010 à 14:00
Bonjour,

Travaillant sur les services, j'ai généralement besoin de tous les droits.
Pour ça je donne au service le compte administrateur.

Est ce que tu as essayé de le faire ?
0
PapyNormand Messages postés 27 Date d'inscription samedi 7 août 2010 Statut Membre Dernière intervention 16 janvier 2014 1
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 )


Bonne journée
0