2017-09-27 3 views
2

Existe-t-il un moyen d'obtenir les informations d'historique du planificateur de tâches dans un tableau ou une variable à l'intérieur d'un lot ou d'un script PowerShell. Par exemple, obtenez les informations telles que le nom de la tâche, la date et l'heure au démarrage de la tâche (ID d'événement: 100) et la date d'achèvement (ID d'événement: 102). Ainsi, je peux mettre à jour une base de données SQL avec les informations. (La table sql peut ressembler à ceci et je sais comment insérer dans la base de données une fois Ive a obtenu les informations)Planificateur de tâches - Transforme les informations d'historique en variables de script

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  

Fondamentalement, je ne sais pas comment récupérer cette information, si elle est encore possible. grâce

+0

Avez-vous cherché à utiliser: 'SCHTASKS/Query/V' – Squashman

+1

Quelle version de PowerShell avez-vous? De quel système d'exploitation allez-vous le faire? Qu'avez-vous essayé depuis que cela se lit comme une demande de code qui n'est pas dans l'esprit de SO? – Matt

+0

Je voudrais probablement utiliser 'schtasks/query/v/fo csv | ConvertFrom-Csv'. –

Répondre

2

Les journaux Planificateur de tâches sur le canal d'événement suivant :
Microsoft-Windows-TaskScheduler/Operational

Vous pouvez utiliser Get-WinEvent pour collecter le même ts. Commencez par définir une table de hachage de filtre pour les id 100 événements de départ

# 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) 
} 

Nous sommes besoin va extraire des valeurs de propriété de l'événement de départ, afin de trouver l'événement d'achèvement en corrélation, donc nous allons créer une propriété sélecteur

# 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) 

maintenant récupérer les événements de début, trouver l'événement d'achèvement correspondant et sortie l'information comme un nouvel objet personnalisé:

# 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 
    } 
} 

Vous pouvez remplir un DataTable avec les objets $TaskInvocations, ou de générer une requête d'insertion sur la base des valeurs de propriété

0

Dans le lot que vous pouvez faire quelque chose comme ça:

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

Ou vous pouvez jeter un oeil à cette réponse dans Powershell: How to use PowerShell to inventory Scheduled Tasks?

+0

Comment cela va-t-il l'aider à obtenir les données dans une base de données SQL? –