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.

COMMENT FAIRE?

Tout d'abord, avec quel outil récupèreront nous la liste des tâches? Il en existe principalement deux en partant de Powershell :

  • L'objet "Schedule.Service"
  • La commande schtasks

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 :

  • /query : pour préciser le type d'action (ici une requête)
  • /s SERVEUR : pour préciser qu'il s'agit du système distant nommé SERVEUR
  • /xml one : pour renvoyer en retour un fichier XML unique contenant l'intégralité des informations plutot qu'un texte brute à parser ensuite.

task1

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.

task2

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.

task3

Par exemple, voici les propriétés de la toute première tâche du tableau.

task4

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)

task5

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é.

task6

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*"}

Script complet

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*"}

Ajouter un commentaire

Article précédent Article suivant