none
Lister les processus RRS feed

  • Question

  • Bonjour, Je suis débutant avec le VB .net 2008, Je veut savoir comment en peux lister les processus et leur chemin dans un ListView? Merci d'avance
    If you find that my answer was what you were looking for, please remember to click the "mark as answered" box below! =========================================================== Dr WoRm
    dimanche 27 décembre 2009 19:38

Réponses

  • Bonjour a tous

    La class Process ne permet pas de récupérer le chemin même (avec les arguments)
    La seul possibilité serait de passer par la class WMI process qui, elle, permet de faire tout ce qu'on souhaite

    Imports System
    Imports System.Management
    Imports System.Windows.Forms
    
    Namespace WMISample
    
        Public Class MyWMIQuery
    
            Public Overloads Shared Function Main() As Integer
    
                Try
                    Dim searcher As New ManagementObjectSearcher( _
                        "root\CIMV2", _
                        "SELECT * FROM Win32_Process") 
    
                    For Each queryObj As ManagementObject in searcher.Get()
    
                        Console.WriteLine("-----------------------------------")
                        Console.WriteLine("Win32_Process instance")
                        Console.WriteLine("-----------------------------------")
                        Console.WriteLine("Caption: {0}", queryObj("Caption"))
                        Console.WriteLine("CommandLine: {0}", queryObj("CommandLine"))
                        Console.WriteLine("CSName: {0}", queryObj("CSName"))
                        Console.WriteLine("ExecutablePath: {0}", queryObj("ExecutablePath"))
                    Next
                Catch err As ManagementException
                    MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
                End Try
            End Function
        End Class
    End Namespace


    A bientot
    Cordialement, Troxsa
    • Marqué comme réponse Alex Petrescu lundi 4 janvier 2010 14:48
    mercredi 30 décembre 2009 11:26
    Auteur de réponse

Toutes les réponses

  • Salut,

    Pour avoir accès  a des processus locaux ou distants, on utilise la classe Process.

    Voici un exemple simple pour lire les noms des processus qui exécutent sur votre machine.

    Ajoutez un contrôle ListBox sur un Window Form. Changez le nom du contrôle en MyList et puis ajoutez le code suivant dans un méthode :

     

    MyList.DisplayMember = "ProcessName"
    Dim p As Process
    For Each p in Process.GetProcesses
    MyList.Items.Add(p)
    Next 

    Cordialement,
    Alex

    Alex Petrescu - MSFT
    lundi 28 décembre 2009 10:44
  • Bonjour,
    Merci pour ta réponse, mais comment on peut recupérer le chemin du processus?

    If you find that my answer was what you were looking for, please remember to click the "mark as answered" box below! =========================================================== Dr WoRm
    lundi 28 décembre 2009 11:56
  • Bonjour,

    En mode debug, j'ai regardé les membres d’objet Process. On a la propriété StartInfo.WorkingDirectory et StartInfo.FileName, mais je ne vois aucune valeur dans ces propriétés. La documentation de MSDN donne des exemples pour le cas ou on veut créer et démarrer un processus. Dans ce cas, on met le nom de l’exécutable dans la propriété FileName et on exécute la commande MonProcessus.Start(). Malheureusement, je ne trouve aucune indication pour le cas ou on veut récupérer le nom d’un fichier qui est déjà en exécution.

    Pour le moment, la solution que je vois est un peu compliquée : après avoir les noms des processus, chercher les fichiers correspondants sur le disque. Quand-même, ce n’est pas une solution satisfaisante, car on peut avoir plusieurs exécutables ou plusieurs fichiers avec le meme nom, dans des locations différentes.

    Je continuerais a chercher une solution, j’espère de trouver une réponse jusqu’à la fin. Au même temps, si vous trouvez la bonne réponse, je vous prie de la poster ici, peut-être il y en a d’autres qui sont intéressés.

    Cordialement,

    Alex

     


    Alex Petrescu - MSFT
    mardi 29 décembre 2009 08:51
  • Bonjour a tous

    La class Process ne permet pas de récupérer le chemin même (avec les arguments)
    La seul possibilité serait de passer par la class WMI process qui, elle, permet de faire tout ce qu'on souhaite

    Imports System
    Imports System.Management
    Imports System.Windows.Forms
    
    Namespace WMISample
    
        Public Class MyWMIQuery
    
            Public Overloads Shared Function Main() As Integer
    
                Try
                    Dim searcher As New ManagementObjectSearcher( _
                        "root\CIMV2", _
                        "SELECT * FROM Win32_Process") 
    
                    For Each queryObj As ManagementObject in searcher.Get()
    
                        Console.WriteLine("-----------------------------------")
                        Console.WriteLine("Win32_Process instance")
                        Console.WriteLine("-----------------------------------")
                        Console.WriteLine("Caption: {0}", queryObj("Caption"))
                        Console.WriteLine("CommandLine: {0}", queryObj("CommandLine"))
                        Console.WriteLine("CSName: {0}", queryObj("CSName"))
                        Console.WriteLine("ExecutablePath: {0}", queryObj("ExecutablePath"))
                    Next
                Catch err As ManagementException
                    MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
                End Try
            End Function
        End Class
    End Namespace


    A bientot
    Cordialement, Troxsa
    • Marqué comme réponse Alex Petrescu lundi 4 janvier 2010 14:48
    mercredi 30 décembre 2009 11:26
    Auteur de réponse
  • Bonsoir Alex,

    Vous pouvez procéder de la manière suivante :

            For Each proc As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses()
                Console.WriteLine(proc.ProcessName + " : " + System.IO.Path.GetDirectoryName(proc.MainModule.FileName))
            Next proc

    Cordialement,


    Mathieu Francesch Sharplog Engineering www.sharplog.fr
    • Modifié Mathieu Francesch mercredi 30 décembre 2009 21:48 Ajout de la méthode GetDirectoryName
    • Proposé comme réponse Mathieu Francesch mercredi 30 décembre 2009 21:51
    mercredi 30 décembre 2009 21:45
  • Bonjour / Bonsoir Mathieu

    Visual Studio 2008 est exécuté en tant que "Administrateur"
    Je suis sous Windows 7 et j'ai pas mal d'accès refusé, avec votre code

    Avec WMI WIN32_Process je n'ai aucune erreur

    je me demandait si vous avez une idée du pourquoi il y a tant d'accès refusé avec le code que vous avez proposé ?

    .
    Cordialement, Troxsa
    mercredi 30 décembre 2009 22:02
    Auteur de réponse
  • Bonsoir TroXsa,

    Les process System et Idle ne pocède pas de MainModule et ne sont pas liés à un fichier (à fortiori un dossier) et c'est pour cette raison que vous pouvez avoir des erreurs (on essaye d'accèder à quelque chose qui n'existe pas)

    D'ailleurs, si vous observez le résultat de votre code vous remarquerez ceci :

    -----------------------------------
    Win32_Process instance
    -----------------------------------
    Caption: System Idle Process
    CommandLine:
    CSName: SHARPMFH
    ExecutablePath:
    -----------------------------------
    Win32_Process instance
    -----------------------------------
    Caption: System
    CommandLine:
    CSName: SHARPMFH
    ExecutablePath:

    Est ce que si vous modifiez le code de la manière suivante vous obtenez encore des erreurs ? :

            For Each proc As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses()
                If Not proc.ProcessName.Equals("System") And Not proc.ProcessName.Equals("Idle") Then
                    Console.WriteLine(proc.ProcessName + " : " + System.IO.Path.GetDirectoryName(proc.MainModule.FileName))
                End If
            Next proc
    Pour information je suis sous windows xp sp3

    Cordialement,



    Mathieu Francesch Sharplog Engineering www.sharplog.fr
    mercredi 30 décembre 2009 23:31
  • Salut Mathieu,

    Merci pour votre réponse. J’ai essayee votre solution et ça marche, mais pas pour tous les processus. Comme TroXsa, moi aussi j’ai essayé sur Win 7, avec VS 2010, avec un compte d’administrateur.  Pour la plupart des processus, en mode debug je vois le message « Acces is denied »  pour la propriété FileName. Je sais qu’on peut avoir un problème de droit d’accès si on utilise ce code en tant qu’utilisateur normale, mais je pensais que sur un compte d’administrateur ça devrait marcher.

     


    Alex Petrescu - MSFT
    jeudi 31 décembre 2009 09:08
  • Bonjour Alex,

    Je n'ai pas essayé ce code ni sur Win 7 ni sur Vista. Est-ce que les processus en "Acces is denied" ne seraient pas ceux executés avec le compte System ?

    Ce n'est pas une solution mais plutôt un test : Est-ce qu'en désactivant l'UAC vous avez à nouveau des messages d'erreurs ?

    D'avance merci pour vos informations.

    Cordialement,
    Mathieu Francesch Sharplog Engineering www.sharplog.fr
    jeudi 31 décembre 2009 09:19
  • J’ai désactivé l’UAC et c’est la même chose. Je ne peux voire aucun processus de LOCAL SERVICE, NETWORK SERVICE ou SYSTEM. Les seules processus dont je vois la location de l’exécutable sont ceux qui roulent sous mon compte d’administrateur, et ce sont les processus du VS 2010. J’ai l’impression que le reste des processus que je ne peux pas voire sont ceux qui se trouvent dans windows/system32, comme notepad, par exemple. Je vais essayer aussi sur une autre machine, peut-etre il y a quelque chose qui m’échappe.

    Merci pour votre aide et votre intérêt dans ce sujet.


    Alex Petrescu - MSFT
    jeudi 31 décembre 2009 09:54
  • Bonjour,

    Il semble que ça soit pareil en désactivant UAC
    Pour lister les process sans les chemins il faudra utiliser un bloc Try ...


    Cordialement, Troxsa
    jeudi 31 décembre 2009 10:19
    Auteur de réponse
  • Cela m'échappe aussi...

    Il est peut-être possible de passer outre en faisant de l'impersonnalisation.

    Il y a un article intéressant sur le MSDN : http://msdn.microsoft.com/fr-fr/library/w070t6ka.aspx

    Cela dit, si avec la méthode de Troxsa cela fonctionne bien, je ne vois pas pourquoi on se compliquerait la vie :-)

    Je vais quand même m'installer Win 7 sur une VM.

    Bon courage et surtout bonne fête ^^



    Mathieu Francesch Sharplog Engineering www.sharplog.fr
    jeudi 31 décembre 2009 11:07