Auswertung vom Schtasks.exe Output

  • Hi,

    ich möchte den Output von schtasks /query /s localhost /fo csv /v filtern, indem ich nur die Schedule Tasks filtere, die nur aktiv sind!

    Spoiler anzeigen
    [autoit]


    Local $server = "localhost"
    Local $run = Run(@ComSpec & " /c schtasks.exe /s " & $server & " /query /fo csv /v", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $c, $l, $string, $tmp, $chk, $output
    While 1
    $l &= StdoutRead($run)
    If @error Then ExitLoop
    WEnd
    ConsoleWrite($l & @CRLF)

    [/autoit]

    Das Ganze soll natürlich sprach- und OS unabhängig sein, d.h. das Skript soll genauso auf Deutschen wie auch z.B. französischen, Win2003, Win2008, etc. System laufen!

    Ich dachte da an RegExp, aber weiß nocht nicht, wie...

    Hat jemand eine Idee?

    Gruß,
    UEZ

    PS: eine Möglichkeit siehe Post #6 unten.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    3 Mal editiert, zuletzt von UEZ (30. Dezember 2010 um 21:41)

  • Hmmh, das hilft nur bedingt. Jetzt habe ich 100% des Outputs, aber weiß nicht was du haben willst.
    Alles wo unter Nächste Ausführungszeit ein Datum steht? Wo ist der Unterschied bei anderen OS/Sprachen?

    Hier ein Beispiel unter Vista x32 Deutsch:

    autoit.de/wcf/attachment/8884/

    Ich möchte einfach die Tasks auslesen, die in dem Screenshot gelistet sind, sprach- und OS unabhängig.

    Gruß,
    UEZ

  • Hier eine Lösung:

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_UseX64=n

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

    #include <Constants.au3>
    Opt("MustDeclareVars", 1)

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

    ConsoleWrite(Get_Schtasks() & @CRLF)

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

    ; #FUNCTION# =============================================================================
    ; Name..............: Get_Schtasks
    ; Description ....: Enumerates NOT from windows created scheduled tasks from a (remote) system
    ; Syntax............: Get_Schtasks($system = "localhost", $delimiter = "|"))
    ; Parameters ....: $system - enter the hostname or ip address where to enumerate the scheduled tasks
    ; $delimter - delmiter for each header, standard is '|'
    ; $header - returns also a header
    ; Header: HostName|TaskName|Next Run Time|Status|Logon Mode|Last Run Time|Last Result|Author|Task To Run|Start In|Comment|Scheduled Task State|Idle Time|Power Management|Run As User|Delete Task If Not Rescheduled|Stop Task If Runs X Hours and X Mins|Schedule|Schedule Type|Start Time|Start Date|End Date|Days|Months|Repeat: Every|Repeat: Until: Time|Repeat: Until: Duration|Repeat: Stop If Still Running
    ; Return Value.: String with scheduled tasks
    ; Author...........: UEZ
    ; Version .........: v0.90 build 2010-12-30 Beta
    ; =========================================================================================
    Func Get_Schtasks($system = "localhost", $delimiter = "|", $header = False)
    If $system = "localhost" Then $system = @ComputerName
    Local $run = Run(@ComSpec & " /c schtasks.exe /s " & $system & " /query /fo csv /v", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Local $c, $l, $arr, $aChk, $test, $ext, $output, $s
    While 1
    $l &= StdoutRead($run)
    If @error Then ExitLoop
    WEnd
    ;~ If $header Then $output = '"Hostname"' & $delimiter & '"Aufgabenname"' & $delimiter & '"Nächste Ausführungszeit"' & $delimiter & '"Status"' & $delimiter & '"Anmeldemodus"' & $delimiter & '"Letzte Laufzeit"' & $delimiter & '"Letztes Ergebnis"' & $delimiter & '"Autor"' & $delimiter & '"Auszufhrende Aufgabe"' & $delimiter & '"Starten in"' & $delimiter & '"Kommentar"' & $delimiter & '"Status der geplanten Aufgabe"' & $delimiter & '"Leerlaufzeit"' & $delimiter & '"Energieverwaltung"' & $delimiter & '"Als Benutzer ausführen"' & $delimiter & '"Aufgab lö”schen, falls nicht verlegt"' & $delimiter & '"Aufgabe beenden, falls sie X St. und X Min. ausgeführt wird"' & $delimiter & '"Zeitplan"' & $delimiter & '"Zeitplantyp"' & $delimiter & '"Startzeit"' & $delimiter & '"Startdatum"' & $delimiter & '"Enddatum"' & $delimiter & '"Tage"' & $delimiter & '"Monate"' & $delimiter & '"Wiederholung: Jede(n)"' & $delimiter & '"Wiederholung: Bis: Zeit"' & $delimiter & '"Wiederholung: Bis: Dauer"' & $delimiter & '"Wiederholung: Beenden, falls immer noch ausgeführt"'& @CRLF
    If $header Then $output = '"HostName"' & $delimiter & '"TaskName"' & $delimiter & '"Next Run Time"' & $delimiter & '"Status"' & $delimiter & '"Logon Mode"' & $delimiter & '"Last Run Time"' & $delimiter & '"Last Result"' & $delimiter & '"Author"' & $delimiter & '"Task To Run"' & $delimiter & '"Start In"' & $delimiter & '"Comment"' & $delimiter & '"Scheduled Task State"' & $delimiter & '"Idle Time"' & $delimiter & '"Power Management"' & $delimiter & '"Run As User"' & $delimiter & '"Delete Task If Not Rescheduled"' & $delimiter & '"Stop Task If Runs X Hours and X Mins"' & $delimiter & '"Schedule"' & $delimiter & '"Schedule Type"' & $delimiter & '"Start Time"' & $delimiter & '"Start Date"' & $delimiter & '"End Date"' & $delimiter & '"Days"' & $delimiter & '"Months"' & $delimiter & '"Repeat: Every"' & $delimiter & '"Repeat: Until: Time"' & $delimiter & '"Repeat: Until: Duration"' & $delimiter & '"Repeat: Stop If Still Running"' & @CRLF
    $arr = StringSplit($l, Chr(10))
    For $c = 1 To $arr[0] - 1
    $aChk = StringSplit($arr[$c], ",")
    If $aChk[0] < 2 Then ContinueLoop
    If $aChk[1] <> '"Hostname"' And $aChk[2] <> '"Taskname"' Then
    If StringLeft($aChk[2], 2) = '"\' Then
    $s = 3
    $test = StringReplace(StringMid($aChk[2], $s), "\", "\")
    Else
    $s = 1
    $test = StringReplace(StringMid($aChk[2], $s), "\", "\")
    EndIf
    $ext = @extended
    If $aChk[0] > 0 And $ext = 0 Then
    $arr[$c] = StringReplace($arr[$c], $aChk[2], '"'& StringMid($aChk[2], $s))
    $output &= StringReplace($arr[$c], '","', '"' & $delimiter & '"')
    EndIf
    EndIf
    Next
    Return SetError(0, 0, $output)
    EndFunc

    [/autoit]

    Jetzt muss ich es auch auf anderen System testen...

    Gruß,
    UEZ

  • Hmm, so sieht der CMD-Output unter XP OSLANG ENG
    Alle Tasks sind gespeichert unter %systemroot%\Tasks\
    Protokollierung wird in %systemroot%\SchedLgU.txt gespeichert

    Spoiler anzeigen
    [autoit]


    =========
    Verbose schtasks /query /fo list /v
    =========
    HostName: user
    TaskName: 7-Zip File Manager
    Next Run Time: 21:09:00, 5/1/2010
    Status:
    Last Run Time: Never
    Last Result: 0
    Creator: user
    Schedule: At 9:09 PM on day 1 of every month, starting 4/1/2010
    Task To Run: C:\PROGRA~1\7-Zip\7zFM.exe
    Start In: C:\PROGRA~1\7-Zip
    Comment: N/A
    Scheduled Task State: Enabled
    Scheduled Type: Monthly
    Start Time: 21:09:00
    Start Date: 4/1/2010
    End Date: N/A
    Days: 1
    Months: JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
    Run As User: Could not be retrieved from the task scheduler database
    Delete Task If Not Rescheduled: Disabled
    Stop Task If Runs X Hours and X Mins: 72:0
    Repeat: Every: Disabled
    Repeat: Until: Time: Disabled
    Repeat: Until: Duration: Disabled
    Repeat: Stop If Still Running: Disabled
    Idle Time: Disabled
    Power Management: No Start On Batteries, Stop On Battery Mode

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

    HostName: user
    TaskName: AutoIt Window Info
    Next Run Time: 21:09:00, 4/13/2010
    Status:
    Last Run Time: Never
    Last Result: 0
    Creator: user
    Schedule: At 9:09 PM every day, starting 4/12/2010
    Task To Run: C:\PROGRA~1\AutoIt3\Au3Info.exe
    Start In: C:\PROGRA~1\AutoIt3
    Comment: N/A
    Scheduled Task State: Enabled
    Scheduled Type: Daily
    Start Time: 21:09:00
    Start Date: 4/12/2010
    End Date: N/A
    Days: Everyday
    Months: N/A
    Run As User: Could not be retrieved from the task scheduler database
    Delete Task If Not Rescheduled: Disabled
    Stop Task If Runs X Hours and X Mins: 72:0
    Repeat: Every: Disabled
    Repeat: Until: Time: Disabled
    Repeat: Until: Duration: Disabled
    Repeat: Stop If Still Running: Disabled
    Idle Time: Disabled
    Power Management: No Start On Batteries, Stop On Battery Mode

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

    HostName: user
    TaskName: XnView
    Next Run Time: 21:10:00, 4/19/2010
    Status:
    Last Run Time: Never
    Last Result: 0
    Creator: user
    Schedule: At 9:10 PM every Mon of every week, starting 4/12/2010
    Task To Run: C:\PROGRA~1\XnView\xnview.exe
    Start In: C:\PROGRA~1\XnView
    Comment: N/A
    Scheduled Task State: Enabled
    Scheduled Type: Weekly
    Start Time: 21:10:00
    Start Date: 4/12/2010
    End Date: N/A
    Days: MONDAY
    Months: N/A
    Run As User: Could not be retrieved from the task scheduler database
    Delete Task If Not Rescheduled: Disabled
    Stop Task If Runs X Hours and X Mins: 72:0
    Repeat: Every: Disabled
    Repeat: Until: Time: Disabled
    Repeat: Until: Duration: Disabled
    Repeat: Stop If Still Running: Disabled
    Idle Time: Disabled
    Power Management: No Start On Batteries, Stop On Battery Mode

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

    ==========
    No Verbose schtasks /query /fo list
    ==========
    HostName: user
    TaskName: 7-Zip File Manager
    Next Run Time: 21:09:00, 5/1/2010
    Status:

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

    HostName: user
    TaskName: AutoIt Window Info
    Next Run Time: 21:09:00, 4/13/2010
    Status:

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

    HostName: user
    TaskName: XnView
    Next Run Time: 21:10:00, 4/19/2010
    Status:

    [/autoit]

    - MfG OpaEd

    Einmal editiert, zuletzt von opaed (12. April 2010 um 22:19)

    • Offizieller Beitrag

    Hi,

    kannst du es hiermit ggf. auch einschränken?

    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_ScheduledJob", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
    $Output = $Output & "Command: " & $objItem.Command & @CRLF
    $Output = $Output & "DaysOfMonth: " & $objItem.DaysOfMonth & @CRLF
    $Output = $Output & "DaysOfWeek: " & $objItem.DaysOfWeek & @CRLF
    $Output = $Output & "Description: " & $objItem.Description & @CRLF
    $Output = $Output & "ElapsedTime: " & WMIDateStringToDate($objItem.ElapsedTime) & @CRLF
    $Output = $Output & "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $Output = $Output & "InteractWithDesktop: " & $objItem.InteractWithDesktop & @CRLF
    $Output = $Output & "JobId: " & $objItem.JobId & @CRLF
    $Output = $Output & "JobStatus: " & $objItem.JobStatus & @CRLF
    $Output = $Output & "Name: " & $objItem.Name & @CRLF
    $Output = $Output & "Notify: " & $objItem.Notify & @CRLF
    $Output = $Output & "Owner: " & $objItem.Owner & @CRLF
    $Output = $Output & "Priority: " & $objItem.Priority & @CRLF
    $Output = $Output & "RunRepeatedly: " & $objItem.RunRepeatedly & @CRLF
    $Output = $Output & "StartTime: " & WMIDateStringToDate($objItem.StartTime) & @CRLF
    $Output = $Output & "Status: " & $objItem.Status & @CRLF
    $Output = $Output & "TimeSubmitted: " & WMIDateStringToDate($objItem.TimeSubmitted) & @CRLF
    $Output = $Output & "UntilTime: " & WMIDateStringToDate($objItem.UntilTime) & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_ScheduledJob" )
    Endif

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

    Func WMIDateStringToDate($dtmDate)

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

    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]


    Mega

  • Das geht nur, wenn der Schedule Task mit WMI (oder mit at.exe?) erstellt worden ist!

    Mit WMI bekomme ich eine leere Liste zurück!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯