Lister les tâches planifiées avec PowerShell
Les administrateurs système ont régulièrement besoin de planifier des tâches sur des serveurs.
Cet article permet de montrer qu’il est possible de monitorer l’état des tâches planifiées via PowerShell.
Dès Windows Vista, il est possible de jouer avec les tâches planifiées via l’objet COM ‘Schedule.Service’.
Voici un exemple d’utilisation :
$ComputerName = $env:COMPUTERNAME
$Schedule = new-object -com("Schedule.Service")
$Schedule.connect($ComputerName)
$Tasks = $Schedule.getfolder("\").gettasks(0)
$Tasks | Select-Object Name, State, Path, LastRunTime, LastTaskResult
Depuis Windows 7, le PowerShellPack, un Ressource kit bien pratique, met à disposition des utilisateurs plusieurs modules PowerShell, dont le module ‘TaskScheduler’.
Pour les utilisateurs de Windows XP/2003, la tâche est un peu plus hardue.
Une première solution consiste à développer un Wrapper autour d’une API « Task Scheduler » développée en C#.
Bref, amusant pour certains, cela devient vite un casse tête pour les autres !
Une autre approche consiste à utiliser l’outil en ligne de commande ‘schtasks.exe‘.
Cette commande existe sous Windows XP/2003… et elle est toujours présente sous Windows 7/2008 R2.
Voici les paramètres possibles de ‘schtasks.exe’, pour ce qui concerne la partie affichage (display) :
Nous pouvons remarquer que cette commande permet d’exporter la liste des tâches planifiées dans un fichier CSV, via l’utilisation du paramétre ‘/FO’ et en lui spécifiant la valeur ‘CSV’.
schtasks.exe /query /fo csv
S’il manque des informations, nous pouvons également ajouter le paramètre /V, afin d’activer le mode ‘verbose’ :
schtasks.exe /query /fo csv /v
Cela devient alors illisible dans la console.
Pour plus de clarté et afin de rendre ce résultat exploitable, transformons le en une collection d’objets : Un objet par tâche, des propriétés pour chaque colonne renvoyée par la commande Schtasks.
schtasks.exe /query /fo csv /v | ConvertFrom-Csv
Pour exporter la liste des tâches ainsi récupérée dans un fichier de type csv, rien de plus simple. Il suffit d’exécuter cette commande :
schtasks.exe /query /fo csv /v > C:\Taches.csv
Mais dans ce cas, le séparateur n’est pas le « ; » mais la « , », c’est à dire que le fichier csv sera dans la langue de Shakespeare et difficilement exploitable sous un Excel profitant des paramètres régionaux bien de « t’ché nous » …
Cette commande répond alors au besoin :
schtasks.exe /query /fo csv /v | ConvertFrom-Csv | Export-Csv C:\Taches.csv -NoTypeInformation -Delimiter ";"
Au final, nous pouvons élaborer ce petit script qui nous permettra d’auditer toutes les tâches planifiées sur une liste de serveurs définie :
Function Get-ScheduledTasks{
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[Alias("Name")]
[ValidateScript({Test-Connection -ComputerName $_ -Count 1 -Quiet})]
[string[]]$ComputerName,
[Parameter(Position=0,Mandatory=$True)]
[string]$CsvPath
)
Begin{
Write-Debug "Initializing 'GlobalCsv' variable ..."
$GlobalCsv = $null
}
Process{
Foreach($Computer in $ComputerName){
Write-Debug "Getting Scheduled Tasks from '$Computer' ..."
$GlobalCsv += C:\WINDOWS\SYSTEM32\schtasks.exe /query /S $Computer /FO csv /V | ConvertFrom-Csv
}
}
End{
Write-Debug "Exporting results in csv file '$CsvPath' ..."
$GlobalCsv | Export-Csv $CsvPath -NoTypeInformation -Delimiter ";" -encoding UTF8
}
}
Dans ce code, nous pourrons noter l’utilisation du paramétre ‘-encoding’ et de sa valeur à ‘UTF8′. L’utilisation de ‘schtasks.exe’ sur des OS Windows français nous donne effectivement des informations contenant souvent des caractères accentués. Alors il vaut mieux le préciser lors de l’export
Cette fonction accepte le pipeline (‘ValueFromPipeline’).
Nous pouvons donc récupérer une liste de serveurs (par exemple, depuis un fichier texte ou via une commande plus élaborée qui requête une liste de serveurs dans l’annuaire Active Directory)
et transmettre chacun des noms de serveurs à notre fonction via le pipeline :
Get-Content .\MaListeDeServeurs.txt |
Get-ScheduledTasks -ComputerName {$_} -CsvPath C:\Taches.csv
Ou bien encore :
Get-QADComputer -ComputerRole DomainController |
Get-ScheduledTasks -ComputerName {$_.Name} -CsvPath C:\Taches.csv
Ainsi, Le fichier Taches.csv contient toutes les tâches présentes sur les serveurs.
La commande Schtasks.exe renvoie bien le nom du serveur concerné, pour chaque tâche trouvée.
Il est donc simple ensuite de filtrer ces données dans Excel afin de faire ressortir, par exemple, les tâches qui ne fonctionnent pas ou plus.
On pourra alors planifier l’exécution de notre script PowerShell afin de réaliser régulièrement un audit de notre plateforme de serveurs
Concernant la gestion des Job Planifiés via PowerShell version 3.0, voici une vidéo récente et très intéressante, par Jeffery Hicks (MVP PowerShell) :
http://www.youtube.com/watch?v=RhRoofMOoI0
Salut, je jouais avec ton script, et j’ai eu besoin de plus
Du coup étant fénéant, j’ai trouvé ça http://powershell.codeplex.com/releases/view/54703
Vraiment pas mal
@+
Salut,
Yes. Dommage qu’il n’y ait pas de ‘Set-ScheduleTask’, comme dans le module ‘TaskScheduler’ du ‘PowerShellPack’ ou le module ‘ScheduledTasks’ de Windows 8 / 2012.
Pour ce dernier, voir l’article en 2 partie de Jeffery ici : http://www.petri.co.il/manage-scheduled-tasks-windows-8-windows-server-2012-powershell-part-1.htm
@+