Accueil > Apprendre, Scripts > Lister les tâches planifiées avec PowerShell

Lister les tâches planifiées avec PowerShell

plannificateur_taches 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

 

schtasks001

 

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

 

schtasks01

 

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

 

schtasks02

 

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

 

schtasks03

 

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

  1. 06/08/2012 à 19:35 | #1

    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

  2. benduru
    27/12/2012 à 12:24 | #2

    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

    @+

  3. 27/12/2012 à 13:53 | #3

    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

    @+

  1. Pas encore de trackbacks
Vous devez être identifié pour poster un commentaire