Suche einen bestimmten Prozess auf einer Remote-Maschine

  • Hallo Zusammen,

    leider kann ich mit "ProcessExists" nur lokal laufende Prozesse abfragen. Gibt es auch eine Möglichkeit, mit AutoIT einen bestimmten Prozess auf einer entfernten Maschine zu suchen und wenn dieser gefunden wurde, auch noch weitere Informationen zu dem Prozess zu ermitteln (ähnlich wie mit PSLIST)?

    Oder gibt es evtl. hierzu schon eine UDF?

    Ich habe hier über die Suche verschiedene Ansätze gesehen, die auf WMI aufsetzten, jedoch paßt leider kein Treffer zu meinem "Problem" ...

    Vorab vielen Dank,
    Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

    Einmal editiert, zuletzt von TheDude (9. September 2010 um 14:53)

  • Hallo Zusammen,

    im englischen Forum habe ich etwas dazu gefunden. Allerdings mußte ich es etwas modifizieren, damit es auch in meinem Script läuft:

    Spoiler anzeigen

    ;===============================================================================
    ; Function Name: _ProcessListProperties()
    ; Description: Get various properties of a process, or all processes
    ; Call With: _ProcessListProperties( [$process [, $asset]] )
    ; Parameter(s): (optional) $process - PID or name of a process, default is "" (all)
    ; (optional) $asset - remote computer to get list from, default is local
    ; Requirement(s): AutoIt v3.2.4.9+
    ; Return Value(s): On Success - Returns a 2D array of processes, as in ProcessList()
    ; with additional columns added:
    ; [0][0] - Number of processes listed (can be 0 if no matches found)
    ; [1][0] - 1st process name
    ; [1][1] - 1st process PID
    ; [1][2] - 1st process Parent PID
    ; [1][3] - 1st process owner
    ; [1][4] - 1st process priority (0 = low, 31 = high)
    ; [1][5] - 1st process executable path
    ; [1][6] - 1st process CPU usage
    ; [1][7] - 1st process memory usage
    ; [1][8] - 1st process creation date/time = "MM/DD/YYY hh:mm:ss" (hh = 00 to 23)
    ; [1][9] - 1st process command line string
    ; ...
    ; [n][0] thru [n][9] - last process properties
    ; On Failure: Returns array with [0][0] = 0 and sets @Error to non-zero (see code below)
    ; Author(s): PsaltyDS at http://www.autoitscript.com/forum
    ; Date/Version: 12/01/2009 -- v2.0.4
    ; Notes: If an integer PID or string process name is provided and no match is found,
    ; then [0][0] = 0 and @error = 0 (not treated as an error, same as ProcessList)
    ; This function requires admin permissions to the target computer.
    ; All properties come from the Win32_Process class in WMI.
    ; To get time-base properties (CPU and Memory usage), a 100ms SWbemRefresher is used.
    ;===============================================================================
    Func _ProcessListProperties($Process = "",$Asset = "")

    Local $sUserName, $sMsg, $sUserDomain, $avProcs, $dtmDate
    Local $avProcs[1][2] = [[0, ""]], $n = 1

    ; Convert PID if passed as string
    If StringIsInt($Process) Then $Process = Int($Process)

    ; Connect to WMI and get process objects
    $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & $Asset & "\root\cimv2")
    If IsObj($oWMI) Then
    ; Get collection processes from Win32_Process
    If $Process == "" Then
    ; Get all
    $colProcs = $oWMI.ExecQuery("select * from win32_Process")
    ElseIf IsInt($Process) Then
    ; Get by PID
    $colProcs = $oWMI.ExecQuery("select * from win32_Process where ProcessId = " & $Process)
    Else
    ; Get by Name
    $colProcs = $oWMI.ExecQuery("select * from win32_Process where Name = '" & $Process & "'")
    EndIf

    If IsObj($colProcs) Then
    ; Return for no matches
    If $colProcs.count = 0 Then Return $avProcs

    ; Size the array
    ReDim $avProcs[$colProcs.count + 1][10]
    $avProcs[0][0] = UBound($avProcs) - 1

    ; For each process...
    For $oProc In $colProcs
    ; [n][0] = process name
    $avProcs[$n][0] = $oProc.name
    ; [n][1] = process PID
    $avProcs[$n][1] = $oProc.ProcessId
    ; [n][2] = Parent PID
    $avProcs[$n][2] = $oProc.ParentProcessId
    ; [n][3] = Owner
    If $oProc.GetOwner($sUserName, $sUserDomain) = 0 Then $avProcs[$n][3] = $sUserDomain & "\" & $sUserName
    ; [n][4] = Priority
    $avProcs[$n][4] = $oProc.Priority
    ; [n][5] = Executable path
    $avProcs[$n][5] = $oProc.ExecutablePath
    ; [n][8] = Creation date/time
    $dtmDate = $oProc.CreationDate
    If $dtmDate <> "" Then
    ; Back referencing RegExp pattern from weaponx
    Local $sRegExpPatt = "\A(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:.*)"
    $dtmDate = StringRegExpReplace($dtmDate, $sRegExpPatt, "$2/$3/$1 $4:$5:$6")
    EndIf
    $avProcs[$n][8] = $dtmDate
    ; [n][9] = Command line string
    $avProcs[$n][9] = $oProc.CommandLine

    ; increment index
    $n += 1
    Next
    Else
    SetError(2); Error getting process collection from WMI
    EndIf
    ; release the collection object
    $colProcs = 0

    ; Get collection of all processes from Win32_PerfFormattedData_PerfProc_Process
    ; Have to use an SWbemRefresher to pull the collection, or all Perf data will be zeros
    Local $oRefresher = ObjCreate("WbemScripting.SWbemRefresher")
    $colProcs = $oRefresher.AddEnum($oWMI, "Win32_PerfFormattedData_PerfProc_Process" ).objectSet
    $oRefresher.Refresh

    ; Time delay before calling refresher
    Local $iTime = TimerInit()
    Do
    Sleep(20)
    Until TimerDiff($iTime) >= 100
    $oRefresher.Refresh

    ; Get PerfProc data
    For $oProc In $colProcs
    ; Find it in the array
    For $n = 1 To $avProcs[0][0]
    If $avProcs[$n][1] = $oProc.IDProcess Then
    ; [n][6] = CPU usage
    $avProcs[$n][6] = $oProc.PercentProcessorTime
    ; [n][7] = memory usage
    $avProcs[$n][7] = $oProc.WorkingSet
    ExitLoop
    EndIf
    Next
    Next
    Else
    SetError(1); Error connecting to WMI
    EndIf

    ; Return array
    Return $avProcs
    EndFunc ;==>_ProcessListProperties

    Die UDF läuft bei mir super. In dieser Fassung sollte sie auch einfach mit Copy und Paste in andere Projekte zu übernehmen sein. :rolleyes:

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]