[UDF] Traiter les processus par leurs chemins

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

[UDF] Traiter les processus par leurs chemins

#1

Message par matwachich »

Un petit UDF tout simple, tout petit (3 fonctions!) pour traiter les processus par leur chemin et non par le nom de l'exécutable
- Lister les processus
- Fermer un processus
- Savoir si un processus existe bien
Elles fonctionnes comme les fonctions standards (ProcessList , ProcessClose, ProcessExists)

Code : Tout sélectionner

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.6.1
 Author:         Matwachich

 Script Function:
        Fonction traitant les processus par le chemin du fichier, et non par le nom uniquement
        Utile quand on veut 'cibler' un processus en particulier quand on en a plusieurs avec le
        même nom de fichier
#ce ----------------------------------------------------------------------------

#include-once
#include <_processfunctions.au3>
#include <array.au3>

;===============================================================================
;
; Function Name:   _processClosePath($path)
; Description::    Ferme le processus correspondant au chemin du fichier (pas seulement au non du fichier)
;                   Utile par exemple, si vous voulez fermer un processus appelé 'svchost.exe' sans risquer de toucher
;                   au processus système
; Parameter(s):    $path = Chemin du fichier
; Requirement(s):  l'UDF de Ascend4nt's (inclue au début du fichier)
; Return Value(s):  Succes -> Retourne ce que retourne 'ProcessClose' (standard) en fermant un PID
;                   Erreur -> -1 et si:
;                                   Aucun processus avec ce NOM de fichier: @error = 1
;                                   Aucun processus avec ce CHEMIN de fichier: @error = 0
; Author(s):       Matwachich
;
;===============================================================================
;
Func _processClosePath($path)
    Local $fileName = StringTrimLeft($path, StringInStr($path, "\", 1, -1))
    Local $process = _processListPath($fileName)

    If $process[0][0] = 0 Then Return SetError(1, 0, -1)

    Local $pids[$process[0][0]]

    For $i = 1 To $process[0][0]
        If $process[$i][0] = $path Then $pids[$i - 1] = $process[$i][1]
    Next

;~  _ArraySort($pids, 1)

    If $pids[0] <> "" Then
        Return SetError(0, 0, ProcessClose($pids[0]))
;~      ConsoleWrite($pids[0] & @CRLF)
    Else
;~      ConsoleWrite("No" & @CRLF)
        Return SetError(0, 0, -1)
    EndIf
EndFunc

;===============================================================================
;
; Function Name:   _processPathExists($path)
; Description::    Informe si un processus correspondant au chemin du fichier existe
; Parameter(s):     $path = Chemin du fichier
; Requirement(s):   l'UDF de Ascend4nt's (inclue au début du fichier)
; Return Value(s):  Succes -> True (un processus correspondant au CHEMIN du fichier existe)
;                               @extended = Le PID du processus (le plus elevé si il y'en a plusiseurs)
;                   Erreur -> False et si:
;                               Le fichier n'existe pas: @error = 1
;                               Le fichier existe mais aucun processus ne lui correspond: @error = 0
; Author(s):    Matwachich
;
;===============================================================================
;
Func _processPathExists($path)
    If Not FileExists($path) Then Return SetError(1, 0, False)

    Local $fileName = StringTrimLeft($path, StringInStr($path, "\", 1, -1))
;~  ConsoleWrite($fileName & @CRLF)
    Local $process = _processListPath($fileName)

;~  _ArraySort($process, 1, 0, 0, 1)

    For $i = 1 To $process[0][0]
        If $process[$i][0] = $path Then Return SetError(0, $process[$i][1], True)
    Next

    Return SetError(0, 0, False)
EndFunc

;===============================================================================
;
; Function Name:    _processListPath($name = "")
; Description::     Exactement comme 'ProcessList' (standard) saufe qu'elle retourne les CHEMINS et les PID)
; Parameter(s):     $name = (Optionel) Nom du processus à rechercher. si vide, recherche tous les processus
; Requirement(s):   l'UDF de Ascend4nt's (inclue au début du fichier)
; Return Value(s):  Succes -> Array 2D contenant les chemins et les pid
;                       ($array[0][0] = Nombre d'éléments trouvés
;                        $array[$i][0] = chemin du fichier
;                        $array[$i][1] = pid du processus)
;                   Erreur -> -1 et si:
;                           $name n'est pas un string: @error = -1
;                           impossible de construire la liste des processus: @error = 1
; Author(s):    Matwachich
;
;===============================================================================
;
Func _processListPath($name = "")
    If String($name) <> $name Then Return SetError(-1, 0, -1)
    Local $list, $path
    If $name = "" Then
        $list = ProcessList()
    Else
        $list = ProcessList($name)
    EndIf
    Local $handle
    If Not IsArray($list) Then Return SetError(1, 0, -1)

    Local $new[$list[0][0]+1][2]
    $new[0][0] = $list[0][0]

    For $i = 1 To $list[0][0]
        $handle = _ProcessOpen($list[$i][0], 0x0400)
        $path = _ProcessGetPathname($handle)
        If $path = -1 Then $path = $list[$i][0]
        $new[$i][0] = $path
        $new[$i][1] = $list[$i][1]
    Next

    Return $new
EndFunc
 
PS: l'include de Ascend4nt's (forum anglais) est en pièce jointe
Fichiers joints
_ProcessFunctions.au3
(69.39 Kio) Téléchargé 534 fois
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Traiter les processus par leurs chemins

#2

Message par matwachich »

Aucun commentaires??? :( :( :(
Quoi que, ya pas grand chose à dire!

Nouvelle version, plus lente (au minimum 2 fois!), mais qui ne dépend de rien! Il utilise le WMI (inspirer à 99.9% de l'UDF CompInfo.au3)

Code : Tout sélectionner

Func _processListP($name = "")
    Local $objWMIService, $colItems, $aRET[1][2], $i = 1, $uBound

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", 0x10 + 0x20) ; $wbemFlagReturnImmediately + $wbemFlagForwardOnly

    If IsObj($colItems) Then
        For $objItem In $colItems
            If $name <> "" Then
                If $objItem.Name = $name Then
                    $uBound = UBound($aRET)
                    ReDim $aRET[$uBound + 1][2]
                    $aRET[$uBound][0]  = $objItem.ExecutablePath
                    $aRET[$uBound][1] = $objItem.ProcessId

                    If $aRET[$uBound][0] = "" Then $aRET[$uBound][0] = $objItem.Name
                EndIf

            Else
                ReDim $aRET[UBound($aRET) + 1][2]
                $aRET[$i][0]  = $objItem.ExecutablePath
                $aRET[$i][1] = $objItem.ProcessId

                If $aRET[$i][0] = "" Then $aRET[$i][0] = $objItem.Name
            EndIf
            $i += 1
        Next

        $aRET[0][0] = UBound($aRET) - 1
        If $aRET[0][0] < 1 Then Return SetError(1, 1, 0)

        Return $aRET
    Else
        Return SetError(1, 2, 0)
    EndIf
EndFunc

Func _processExistsP($path)
    If Not FileExists($path) Then Return SetError(1, 0, False)
    Local $fileName = StringTrimLeft($path, StringInStr($path, "\", 1, -1))
    Local $process = _NEWprocessListPath($fileName)

    For $i = 1 To $process[0][0]
        If $process[$i][0] = $path Then Return SetError(0, $process[$i][1], True)
    Next
    Return SetError(0, 0, False)
EndFunc

Func _processCloseP($path)
    Local $fileName = StringTrimLeft($path, StringInStr($path, "\", 1, -1))
    Local $process = _NEWprocessListPath($fileName)

    If $process[0][0] = 0 Then Return SetError(1, 0, -1)

    Local $pids[$process[0][0]]

    For $i = 1 To $process[0][0]
        If $process[$i][0] = $path Then $pids[$i - 1] = $process[$i][1]
    Next

    If $pids[0] <> "" Then
        Return SetError(0, 0, ProcessClose($pids[0]))
    Else
        Return SetError(0, 0, -1)
    EndIf
EndFunc
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
FredAI
Niveau 1
Niveau 1
Messages : 3
Enregistré le : mar. 30 nov. 2010 16:37
Status : Hors ligne

Re: [UDF] Traiter les processus par leurs chemins

#3

Message par FredAI »

Salut, matwachich

C'est genial!!! ton UDF. Justement ce qu'il me falait pour le programme que je suis en train de créer.

Merci beaucoup! :D
MaveDev
Niveau 1
Niveau 1
Messages : 9
Enregistré le : jeu. 25 oct. 2012 13:14
Status : Hors ligne

Re: [UDF] Traiter les processus par leurs chemins

#4

Message par MaveDev »

Bonjour, le code fonctionne toujours avec windows 8?

Il y a une petite erreur : error: _NEWprocessListPath(): undefined function.

Merci par avance.


ps : votre premier code avec _ProcessFunctions.au3 ne fonctionne pas correctement. Parfois il retourne que le nom du processus et non le chemin complet. ex : svchost.exe . Je me suis dis c'est un problème de droit de l'UAC. J'ai donc lancer le script en administrateur mais rien 'y fais. Certain processus ne retourne pas le chemin complet.
Répondre