пятница, 10 февраля 2017 г.

PowerShell. Исследуем планировщик задач

Приветствую, уважаемый читатель!

Во время расследования инцидентов безопасности бывает не лишним получить список заданий в планировщике Windows. Есть несколько способов как это можно сделать, в том числе с помощью графических UI,  но мы рассмотрим консольные способы получения заданий.



По сложившейся традиции основным инструментом исследования будет PowerShell. Список заданий будем получать с помощью:
  • консольная утилита  - SchTasks;
  • командлеты PowerShell - Get-ScheduledTask и Get-ScheduledTaskInfo.

  
Утилита SchTasks

Данная утилита является историческим способом получения заданий планировщика с использованием CMD. Рассмотрим на примере:

SCHTASKS /Query /FO TABLE /V > C:\Temp\Tasks1.txt

Данная команда получает список всех запланированных заданий на компьютере в файл. Описание ключей:  

/Query – запросить задания;
/FO – формат вывода результата (TABLE, LIST, CSV);

/V – расширенный вывод информации о задании;



Get-ScheduledTask и Get-ScheduledTaskInfo

Данные командлеты позволяют получить базовую (Get-ScheduledTask) и расширенную (Get-ScheduledTaskInfo) информацию о заданиях в планировщике.

Get-ScheduledTask | Where State -ne "Disabled" | Get-ScheduledTaskInfo 


Скрипт, представленный ниже, позволяет объединить информацию из 2-х командлетов и получить более подробную информацию:


function collect_scheduler {
$path = "C:\Temp\Scheduler.csv";
$TaskCollection=@()
$Shedule_list = Get-ScheduledTask | Where State -ne "Disabled"
foreach ($Task in $Shedule_list) {
         foreach ($TaskInfo in ($Task | Get-ScheduledTaskInfo)) {
             $obj_task = New-Object psobject
             $obj_task | Add-Member -type noteproperty -name TaskPath -Value $Task.TaskPath
             $obj_task | Add-Member -type noteproperty -name TaskName -Value $Task.TaskName
             $obj_task | Add-Member -type noteproperty -name State -Value $Task.State               
             $obj_task | Add-Member -type noteproperty -name Author -Value $Task.Author
             $obj_task | Add-Member -type noteproperty -name LastRunTime -Value $TaskInfo.LastRunTime
             $obj_task | Add-Member -type noteproperty -name LastTaskResult -Value $TaskInfo.LastTaskResult
             $obj_task | Add-Member -type noteproperty -name NextRunTime   -Value $TaskInfo.NextRunTime 
              $TaskCollection += $obj_task
            }
    }
    $TaskCollection | Select-Object @{Name="Hostname"; Expression={$env:COMPUTERNAME}},TaskName,TaskPath,State,Author,LastRunTime,LastTaskResult,NextRunTime | export-csv -path $path -UseCulture -Force -NoTypeInformation -encoding "UTF8"
}

Вывод скрипта:


Может кому пригодиться)



2 комментария:

  1. не работает скрипт
    function collect_scheduler {
    $path = "C:\Temp\Scheduler.csv";
    $TaskCollection=@()
    $Shedule_list = Get-ScheduledTask | Where State -ne "Disabled"
    foreach ($Task in $Shedule_list) {
    foreach ($TaskInfo in ($Task | Get-ScheduledTaskInfo)) {
    $obj_task = New-Object psobject
    $obj_task | Add-Member -type noteproperty -name TaskPath -Value $Task.TaskPath
    $obj_task | Add-Member -type noteproperty -name TaskName -Value $Task.TaskName
    $obj_task | Add-Member -type noteproperty -name State -Value $Task.State
    $obj_task | Add-Member -type noteproperty -name Author -Value $Task.Author
    $obj_task | Add-Member -type noteproperty -name LastRunTime -Value $TaskInfo.LastRunTime
    $obj_task | Add-Member -type noteproperty -name LastTaskResult -Value $TaskInfo.LastTaskResult
    $obj_task | Add-Member -type noteproperty -name NextRunTime -Value $TaskInfo.NextRunTime
    $TaskCollection += $obj_task
    }
    }
    $TaskCollection | Select-Object @{Name="Hostname"; Expression={$env:COMPUTERNAME}},TaskName,TaskPath,State,Author,LastRunTime,LastTaskResult,NextRunTime | export-csv -path $path -UseCulture -Force -NoTypeInformation -encoding "UTF8"
    }

    ОтветитьУдалить