PowerShell – lister les Tâches planifiées des serveurs

Hello,

Pour pouvoir mesurer l’impact du changement de mot de passe de certains comptes, j’ai du trouver une solution permettant de lister toutes les tâches planifiées (Scheduled Tasks) de tous les serveurs de l’AD.

Je me suis initialement penché sur divers scripts utilisant des requêtes WMI, mais cela ne convenait pas car tous les serveurs n’étaient pas configuré pour le PS Remoting.

De ce fait, j’ai écris le script suivant, qui est très simple, puisqu’il va lister les fichiers XML constituant les tâches, sur chaque serveurs. Le but est de générer un fichier de type CSV reprenant le nom du serveur, le nom de la tâche et surtout l’utilisateur qui est configuré pour faire tourner cette tâche.

J’espère qu’il vous sera aussi utile qu’à moi. 🙂

<#
.NAME
	Get-Tasks.ps1
.Synopsis
   PowerShell script to list all Scheduled Tasks and the User ID
.DESCRIPTION
   This script scan the content of the c:\Windows\System32\tasks and search the UserID XML value. 
   The output of the script is a comma-separated log file containing the Computername, Task name, UserID.
.AUTHOR
    Antoine DELRUE
    Contact : antoine@delrue.me - https://obilan.be
#>
# [RECOMMENDED] Reseting variable.
$list = $logfilepath = $computername = $Path = $Item = $tasks = $AbsolutePath = $null

# [REQUIRED] Importer le module Active Directory pour pouvoir lister les serveurs
Import-Module ActiveDirectory

# [OPTIONAL] Afficher les messages de Write-Verbose
$VerbosePreference = "continue"

# [REQUIRED] La variable utilisée pour lister les serveurs contenus dans l'AD. Cette variable ne contient que le nom.
$list = (Get-ADComputer -LDAPFilter "(&(objectcategory=computer)(OperatingSystem=*server*))").Name

# [OPTIONAL] Un message pour dire combien de serveurs vont être utilisés par le script
Write-Verbose  -Message "Trying to query $($list.count) servers found in AD"

# [REQUIRED] Le chemin utilisé pour généré le fichier CSV contenant le résultat du script
$logfilepath = "$home\Desktop\TasksList.csv"

# [OPTIONAL] En cas d'erreur (serveur injoignable), on continue 
$ErrorActionPreference = "SilentlyContinue"

# BEGINNING OF THE LOOP

foreach ($computername in $list)
{
	# [REQUIRED] Construire le chemin vers les fichiers XML des tâches
    $path = "\\" + $computername + "\c$\Windows\System32\Tasks"
	
	# [REQUIRED] Lister les fichiers XML
    $tasks = Get-ChildItem -Path $path -File

	# Si des tâches ont été trouvées, déclarer leur nombre
    if ($tasks)
    {
        Write-Verbose -Message "I found $($tasks.count) task(s) for $computername"
    }

	# [REQUIRED] Pour chaque tâche, effectuer cette boucle
    foreach ($item in $tasks)
    {
		# [REQUIRED] Valider le chemin vers les fichiers
        $AbsolutePath = $path + "\" + $item.Name
		
		# [REQUIRED] Lire le contenu du fichier XML, donc de la tâche
        $task = [xml] (Get-Content $AbsolutePath)
		
		# [REQUIRED] Si le fichier contient un UserID, remplir la variable $check avec ce username
        [STRING]$check = $task.Task.Principals.Principal.UserId

		# [REQUIRED] Si le fichier contient un UserID, écrire l'entrée correspondante dans le fichier de log
        if ($task.Task.Principals.Principal.UserId)
        {
          Write-Verbose -Message "Writing the log file with UserID value for $computername"           
          Add-content -path $logfilepath -Value "$computername,$item,$check"
        }

    }
}

# END OF THE LOOP
 

 

Laisser un commentaire