web-dev-qa-db-ja.com

タスクスケジューラ-履歴情報をスクリプト変数に取得します

タスクスケジューラの履歴情報をバッチまたはPowerShellスクリプト内の配列または変数に取得する方法はありますか?.

たとえば、タスク名、タスクが開始された日時(イベントID:100)、タスクが完了した日時(イベントID:102)などの情報を取得します。これは、SQLデータベースをその情報で更新できるようにするためです。 (SQLテーブルは次のようになります。情報を取得したらデータベースに挿入する方法を知っています)

TaskName    TaskStart              TaskCompleted
task1       27/09/2017 09:00:00    27/09/2017 10:00:00    
task2       27/09/2017 12:00:00    27/09/2017 16:00:00    
task1       04/10/2017 09:00:00    04/09/2017 09:55:00    

基本的に、可能であれば、その情報を取得する方法はわかりません。ありがとう

7
Sup

タスクスケジューラは、次のイベントチャネルにログを記録します。
Microsoft-Windows-TaskScheduler/Operational

Get-WinEventを使用してイベントを収集できます。 id 100開始イベントのフィルターハッシュテーブルを定義することから始めます

# Event filter for the initial query for all "Start" events in the last 24 hours
$EventFilter = @{
    LogName = 'Microsoft-Windows-TaskScheduler/Operational'
    Id = 100
    StartTime = [datetime]::Now.AddDays(-1)
}

相関する完了イベントを見つけるために、開始イベントからいくつかのプロパティ値を抽出する必要があるので、プロパティセレクターを作成しましょう

# PropertySelector for the Correlation id (the InstanceId) and task name
[string[]]$PropertyQueries = @(
    'Event/EventData/Data[@Name="InstanceId"]'
    'Event/EventData/Data[@Name="TaskName"]'
)
$PropertySelector = New-Object System.Diagnostics.Eventing.Reader.EventLogPropertySelector @(,$PropertyQueries)

次に、開始イベントを取得し、対応する完了イベントを見つけて、その情報を新しいカスタムオブジェクトとして出力します。

# Loop through the start events
$TaskInvocations = foreach($StartEvent in Get-WinEvent -FilterHashtable $EventFilter){
    # Grab the InstanceId and Task Name from the start event
    $InstanceId,$TaskName = $StartEvent.GetPropertyValues($PropertySelector)

    # Create custom object with the name and start event, query end event by InstanceId
    [pscustomobject]@{
        TaskName = $TaskName
        StartTime = $StartEvent.TimeCreated
        EndTime = $(Get-WinEvent -FilterXPath "*[System[(EventID=102)] and EventData[Data[@Name=""InstanceId""] and Data=""{$InstanceId}""]]" -LogName 'Microsoft-Windows-TaskScheduler/Operational' -ErrorAction SilentlyContinue).TimeCreated
    }
}

DataTable$TaskInvocations内のオブジェクトを入力するか、プロパティ値に基づいて挿入クエリを生成できます。

6

バッチであなたはそのようなことをすることができます:

@echo off
SCHTASKS /Query /FO Table > Tasks.txt
Start "" Tasks.txt

または、PowerShellでこの回答を確認できます:PowerShellを使用してスケジュールされたタスクのインベントリを作成する方法

0
Hackoo