Letzten 5 Prozesse

  • Moin-Moin.

    Hat jemand eine Idee, wie man sich die letzten 5 DAZU gekommenen Prozesse anzeigen lassen kann. Ich meine von der Zeit her.
    Im Tastmanager findet man ja nur die gestarteten Prozesse ohne Angabe der Zeit, wann welcher Prozess wann dazu gekommen ist.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo,

    muss los zu Arbeit......
    mir fällt auf die schnelle nur Ascend4nt's ein....schau mal auf seiner Seite nach PerformanceCounters (PDH) da sollte das bei sein was du suchst.....

    Lg Kleiner

  • Kleiner Ansatz. Vieleicht noch alles in ein Array packen und sortieren .... :)

    Spoiler anzeigen
    [autoit]

    ; Generated by AutoIt Scriptomatic

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "CreationDate: " & WMIDateStringToDate($objItem.CreationDate) & @CRLF
    $Output = $Output & "ExecutablePath: " & $objItem.ExecutablePath & @CRLF
    $Output = $Output & "ProcessId: " & $objItem.ProcessId & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_Process" )
    Endif

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
    EndFunc

    [/autoit]

    EDIT:
    Muss doch noch nicht los.
    So in etwa sollte das funktionieren ....

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $aPList = _GetLastProcess(5)
    _ArrayDisplay($aPList)

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetLastProcess($iCount = 0)
    Local $aResult[1][3]
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT ProcessId, CreationDate, ExecutablePath FROM Win32_Process", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    $iDim = 1
    For $objItem In $colItems
    ReDim $aResult[$iDim][3]
    $aResult[$iDim - 1][0] = $objItem.ProcessId
    $aResult[$iDim - 1][1] = WMIDateStringToDate($objItem.CreationDate)
    $aResult[$iDim - 1][2] = $objItem.ExecutablePath
    $iDim += 1
    Next
    _ArraySort($aResult, 1, 0, 0, 1)
    If $iCount <> 0 Then ReDim $aResult[$iCount][3]
    Return $aResult
    Else
    SetError(1)
    EndIf
    EndFunc ;==>_GetLastProcess

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
    EndFunc ;==>WMIDateStringToDate

    [/autoit]

    Edit 2:
    Schöne Idee misterspeed. Hab in meine Version noch schnell einen Filter eingebaut. DIe zu ignorierenden String werden als optionales Array übergeben. Als Standard wird nur @ScriptName ignoriert.

    ungetestet
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    local $aArray[5] = ["scite","autoit", "wmi", "dock", @ScriptDir] ;Prozesse mit diesen Strings im Namen werden ignoriert

    [/autoit] [autoit][/autoit] [autoit]

    $aPList = _GetLastProcess(5, $aArray)
    _ArrayDisplay($aPList, "Final")

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetLastProcess($iCount = 0, $aExclude = "")
    Local $aResult[1][4]
    if not IsArray($aExclude) then
    dim $aExclude[1]
    $aExclude[0] = @ScriptName
    EndIf
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    $aOutput = ""

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT ProcessId, CreationDate, ExecutablePath, Name FROM Win32_Process", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    $iDim = 1
    For $objItem In $colItems
    ReDim $aResult[$iDim][4]
    $aResult[$iDim - 1][0] = $objItem.ProcessId
    $aResult[$iDim - 1][1] = WMIDateStringToDate($objItem.CreationDate)
    $aResult[$iDim - 1][2] = $objItem.Name
    $aResult[$iDim - 1][3] = $objItem.ExecutablePath
    $iDim += 1
    Next
    _ArraySort($aResult, 1, 0, 0, 1)
    For $element in $aExclude
    Do
    $iTmp = _ArraySearch($aResult, $element, 0, 0, 0, 1, 2)
    if @error = 0 then
    _Array2DDelete($aResult, $iTmp)
    EndIf
    until @error = 6
    Next
    If $iCount <> 0 Then ReDim $aResult[$iCount][4]
    Return $aResult
    Else
    SetError(1)
    EndIf
    EndFunc ;==>_GetLastProcess

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
    EndFunc ;==>WMIDateStringToDate

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------------------------------------------------------------------------------------------------------
    ; Fuction _Array2DDelete(ByRef $ARRAY, $iDEL)
    ;
    ; Description Delete one row on a given index in an 1D/2D -Array
    ;
    ; Parameter $ARRAY the array, where one row will deleted
    ; $iDEL Row-Index to delete
    ;
    ; Return Succes -1 ByRef $ARRAY
    ; Failure 0 set @error = 1; given array are not array
    ; set @error = 2; index is out of range
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DDelete(ByRef $ARRAY, $iDEL)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    If ( $iDEL < 0 ) Or ( $iDEL > UBound($ARRAY)-1 ) Then
    SetError(2)
    Return 0
    EndIf
    Local $i, $k, $l
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    Local $arTmp[UBound($ARRAY)-1]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    $arTmp[$k] = $ARRAY[$i]
    $k += 1
    EndIf
    Next
    Else
    Local $arTmp[UBound($ARRAY)-1][$UBound2nd]
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If $i <> $iDEL Then
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$i][$l]
    Next
    $k += 1
    EndIf
    Next
    EndIf
    $ARRAY = $arTmp
    Return -1
    EndFunc ;==>_Array2DDelete

    [/autoit]
  • Mist da war jemand schneller. :D

    Hier meine Variante, allerdings ohne Umwandlung des Timecodes und Begrenzung auf die letzten 5, dafür aber mit Filter, der z.B. den eigenen Prozess und den wmi Dienst ausnimmt:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $aTest = getProcessCreationTimes()
    If IsArray($aTest) Then _ArrayDisplay($aTest)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func getProcessCreationTimes($strComputer = '.')
    Local $aReturn[1][4] = [["Name","PID","Date","Pfad"]]
    Local $x = 0
    Local $objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_process')
    If Not IsObj($colItems) Then Return SetError(2, 0, 0)

    For $objItem In $colItems

    [/autoit] [autoit][/autoit] [autoit]

    ; einige Ausnahmen, die nicht mit angezeigt werden sollen:
    Local $name = $objItem.Name
    If StringInStr($name,"autoit") Then ContinueLoop
    If StringInStr($name,"WmiPrvSE") Then ContinueLoop
    If StringInStr($name,"scite") Then ContinueLoop
    If StringInStr($name,@ScriptName) Then ContinueLoop

    [/autoit] [autoit][/autoit] [autoit]

    $x += 1
    ReDim $aReturn[$x + 1][4]
    $aReturn[$x][0]=$objItem.Name
    $aReturn[$x][1]=$objItem.ProcessID
    $aReturn[$x][2]=$objItem.CreationDate
    $aReturn[$x][3]=$objItem.ExecutablePath
    Next

    _ArraySort($aReturn,1,1,0,2) ; sortiert absteigend nach Erstelldatum
    Return $aReturn
    EndFunc

    [/autoit]
  • Da die Prozesse in der Collection eh schon nach Erstelldatum sortiert sind (zumindest bei mir), braucht man nicht unbedingt den Umweg über ein Array gehen:

    Alternative ohne Sortieren
    [autoit]

    $oWMI = ObjGet('winmgmts:\\localhost\root\cimv2')
    $oItems = $oWMI.ExecQuery('SELECT * FROM Win32_process')

    [/autoit] [autoit][/autoit] [autoit]

    $c = $oItems.Count
    $x = 0
    For $i In $oItems
    $x += 1
    If $x > $c-5 Then ConsoleWrite($i.Caption & @TAB & $i.ProcessID & @CRLF)
    Next

    [/autoit]
  • Moin. ;)

    Ihr habt mich wohl falsch verstanden. NEIN, ich habe mich wohl falsch ausgedrückt. ;)

    Ich suche nicht nach der Möglichkeit nach dem Zeitpunkt wann der Prozess das letzte gestartet wurde,
    sondern sozusagen, wann er ins System eingepflegt und das erste mal gestartet wurde.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Keine Ahnung was du nun genau willst. Ein Prozess wird nicht eingepflegt sondern ausgeführt oder auch nicht, aber dann ist es kein Prozess mehr, sonder einfach nur ein Stück binärer Datenmüll auf deiner Festplatte. Wenn du wissen willst wann die zugehörige exe eines laufenden Prozesses auf deiner Festplatte gespeichert wurde, dann lass dir von obigem WMI query die Dateipfade aller Prozesse geben und prüf mit FileGetTime das Erstelldatum der exe. Wobei letzteres nicht zwingend mit dem Datum zusammenhängt an dem es auf deine Festplatte kopiert wurde, da das Erstelldatum nicht zwingend geändert wird beim kopieren.

    Sofern das auch nicht weiterhilft kann man noch versuchen die Registry nach passenden (De)Installationseinträgen zu durchsuchen, was aber schwierig werden könnte, da nicht jeder laufende Prozess in der Registry verewigt wird noch eine zugehörige Installationsroutine besitzen muss.

    Wenns dir um Langzeitüberwachung geht kannst du auch einfach täglich ein Logfile erstellen/pflegen lassen, welches alle laufenden Prozesse auflistet und dieses dann ggf. auswerten um herauszufinden wann ein Prozess erstmalig aufgetaucht ist. Im nachhinein nützt das aber natürlich nichts mehr.

  • Um AspirinJunkie noch einmal kurz zu bestätigen - natürlich ist die collection nach Startzeitpunkt der Prozesse sortiert. Wenn man mal drüber nachdenkt, macht alles andere ja auch gar keinen SInn.

    Von daher war das hantieren mit dem Array vollkommen unnötig. Danke für den Hinweis :)