Le changement d'un mot de passe administrateur au sein d'un domaine est une opération sensible et risquée, qui peut avoir de lourdes conséquences sur le fonctionnement de l'infrastructure. Dans cet article, nous allons voir comment repérer sur l'intégralité de nos serveurs Windows les différentes tâches planifiées utilisant un compte en particulier, et mieux repérer les effets de bord d'un tel acte.
Tout d'abord, avec quel outil récupèreront nous la liste des tâches? Il en existe principalement deux en partant de Powershell :
Etant donné qu'il se peut que de vieux serveurs restent dans le parc, et que schtasks est présent depuis bien longtemps, j'ai preferé m'en servir afin d'assurer la compatibilité de mon script avec un plus large panel de serveurs.
Schtasks doit être renseigné avec les paramètres suivants :
Le résultat sera enregistré dans une variable au format [xml], que nous analyserons ensuite.
Tout d'abord, notre variable contient une propriété "Tasks", que nous allons développer.
Nous voyons que Tasks est séparée en deux propriétés. La première #comment contient un tableau de noms de tâches. La seconde Task contient un tableau des proprietés de chaque tâche.
Par exemple, voici les propriétés de la toute première tâche du tableau.
Après bien des recherches, j'ai localisé l'endroit ou était situé l'utilisateur utilisé pour l'execution. Dans task.principals.principal.userid. (ouf)
Il ne nous reste donc plus qu'à créer un tableau, reassocier à l'aide d'un index la valeur de #comment à celle de Task, et remplir ce tableau avec les valeurs recherchées. Pour ce faire, créons juste une variable $i à 0, puis faisons un foreach pour chaque #comment afin d'aller piocher dans le Task les informations demandées, ainsi le #comment en position 1 ira piocher dans le task en position 1. (Si la manière d'ajouter des élements dans l'objet vous parait étrange, et diffère de ma façon de faire habituelle avec un PSOBJECT et des Add-Member, sachez que j'expliquerai prochainement pourquoi cette méthode est bien plus interessante)
$tableau = New-object System.Collections.ArrayList
$i = 0
$taches.tasks.'#comment' | % {$add = [pscustomobject]@{
"Serveur" = "Nom_du_serveur"
"Name" = $_
"Utilisateur" = $taches.tasks.task[$i].Principals.principal.userid}
$i++
$tableau.add($add) | Out-Null}
Ainsi, nous avons dans notre tableau l'intégralité des tâches, avec le nom du serveur (dans mon exemple nommé "Nom_du_serveur" mais qui pourra être dynamique si vous faites une boucle sur chaque serveur de votre domaine), le nom utilisé, avec le chemin complet si la tâche n'est pas dans le dossier principal) et le compte utilisé.
Il ne nous reste plus qu'a faire un filtre à l'aide d'un Where-object pour récuperer notre liste de tâches planifiées utilisant le compte recherché (ici, le compte "administrateur").
$tableau | Where-object {$_.utilisateur -like "*administrateur*"}
Vous pouvez télécharger le script depuis mon espace git personnel.
[xml]$taches = schtasks /query /s "Nom_serveur" /xml one
$tableau = New-object System.Collections.ArrayList
$i = 0
$taches.tasks.'#comment' | % {$add = [pscustomobject]@{
"Serveur" = "Nom_du_serveur"
"Name" = $_
"Utilisateur" = $taches.tasks.task[$i].Principals.principal.userid}
$i++
$tableau.add($add) | Out-Null}
$tableau | Where-object {$_.utilisateur -like "*administrateur*"}