Passer d’un script à un « bon » script (PowerShell)

Bonjour à tous,

Dans cet article « un peu particulier » qui ne va pas être réellement un tutoriel, je vais essayer de vous pousser à la réflexion pour passer d’un script « simple » à un « bon » script.

Avant de rentrer dans le sujet, je vais poser le contexte de cet article afin de comprendre pourquoi j’ai écrit ces lignes.

Je suis mentor sur OpenClassrooms et dans un des parcours de formation, les étudiants doivent écrire plusieurs scripts. Avec un peu de recul maintenant, je me suis aperçu qu’ils y arrivent, mais avec des scripts que je qualifierai de « basique », en s’arrêtant au strict minimum sans réelle réflexion sur leur code.

En gros voici l’énoncé du script que l’on va réaliser :

Réaliser un script PowerShell, qui permet d’extraire dans un fichier (texte ou csv) les utilisateurs membres d’un groupe Active Directory, le script devra pouvoir s’exécuter de façon silencieuse ou/(et) interactive.

Avant de se lancer dans le script, on va définir silencieux et interactif :

  • Silencieux : le script n’a pas besoin d’interaction avec l’utilisateur
  • Interactif : le script demandera des informations à l’utilisateur

Pour illustrer le code, je vais me baser sur mon groupe GG_Super_heros, qui comme le montre la capture ci-dessous est composé d’un utilisateur et d’autre groupe :

Je vais directement me lancer dans le script PowerShell, mais avant, il est impératif d’avoir les bases d’algorithmie

Souvent, voici le premier script proposé par les étudiants :

La première chose à dire, c’est Merci GOOGLE ! Alors oui cela répond plus ou moins à la question, car effectivement, cela exporte les membres du groupe GG_Super_heros dans un fichier CSV de façon silencieuse …

Faire un script d’une ligne, statique sans contrôle, y a-t-il réellement un intérêt, car autant ouvrir une fenêtre PowerShell et taper le code non ?

De plus dans mon cas, cela ne va totalement répondre à l’énoncé, car dans mon groupe, j’ai des groupes et je ne vais donc pas avoir que des utilisateurs.

Partant de ce bout de code, je vais expliquer pas à pas comment réaliser un « bon » script.

Qu’est-ce qu’un « bon » script ? Il faut définir cela, c’est un script qui sera dynamique (on pourra changer le groupe, le nom du fichier …), il pourra être silencieux ou interactif (ce n’est pas toujours possible) et on traitera les erreurs (que ce passe t il si le groupe n’existe pas ?) et surtout il répondra à l’énoncé dans tous les cas, c’est-à-dire avoir les utilisateurs qui sont membres du groupe et on va commencer par là.

Je vais traiter la partie export dans le fichier à la fin, je vais donc faire en sorte de supprimer la sortie fichier et avoir une sortie écran en supprimant l’export et je vais ajouter le type d’objet.

Voici donc le script de départ :

Voici la sortie console :

Premier constat, on ne répond plus l’énoncé, car j’ai des groupes et pas que des utilisateurs.

Pour corriger ce problème rien de bien compliqué la solution est donnée, il suffit d’aller faire un tour ici : Get-ADGroupMember (ActiveDirectory) | Microsoft Docs pour trouver la réponse et ajouter le paramètre -Recursive pour ne plus qu’avoir les utilisateurs.

Ci qui nous donne :

Voici maintenant le résultat :

C’est déjà mieux, mais pas encore bon, on n’a pas balayé le cas si dans le groupe j’ai des utilisateurs et des ordinateurs, si j’ajoute un ordinateur dans le groupe et que je passe cette commande, j’aurai l’ordinateur.

Il faut maintenant que l’on filtre le résultat, pour ne garder que les utilisateurs, pour cela on va ajouter un filtre de sortie where à notre cmdlet.

En powershell ajoute des options de sortie ave le | .

Pour le filtre (condition), on va utiliser where comme en SQL.

Ce qui nous donne maintenant :

Maintenant la Cmdlet Get-ADGroupMember retourne les utilisateurs qui sont dans le groupe.

On va maintenant passer à l’amélioration de notre script.

La première étape va être de stocker le nom du groupe dans une variable et d’utiliser cette variable dans la cmdlet Get-ADGroupMember.

Ce qui nous donne le script suivant :

En utilisant une variable, il est plus simple de changer le groupe, mais ce n’est pas très dynamique.

Ce que l’on va faire maintenant, c’est de déclarer la variable en paramètre et ce qui va nous mettre d’appeler notre script de cette manière :

fichier-powershell.ps1 -NomGroupe "GG_Super_heros"

Le code du script maintenant :

La première étape de notre script est terminée, nous avons script dynamique qui s’exécute de façon « silencieuse ».

Avant complexifié le script, nous allons rentre le script interactif et silencieux, comme cela il répond à l’énonce (et même plus).

Pour faire cela, nous allons utiliser une condition (if) afin de tester au début si la variable $NomGroupe est vide, si elle est vide, on demande à l’utilisateur de saisir le nom du groupe.

Afin de faire cela, nous allons utiliser Read-Host.

Ce qui donne :

Si on s’arrête là, le script répond à la demande, il suffit d’ajouter l’export CSV, mais c’est loin d’être parfait ! On pourrait avant de faire de récupérer les utilisateurs, s’assurer que le groupe Active Directory ? Et si, il n’existe pas, sortir du script avec un code erreur.

On va ajouter cette vérification, pour cela on récupère le groupe avec la cmdlet Get-ADGroup et on va utiliser try / catch pour gérer l’erreur et si la commande est en erreur, on affiche un message et on arrête le script.

Voici maintenant le script :

Avec ce script, on arrête le script si le groupe n’existe pas, ce qui évite l’affichage d’un message d’erreur.

Il ne reste plus qu’à faire l’export en CSV en ajoutant le | Export-CSV … Et vue que l’on est sympa, on va afficher un message en indiquant l’emplacement et le nom du fichier. Je vais aussi ajouter le nom du groupe dans le nom du fichier, ce qui permet de jouer plusieurs fois le script sans écraser le fichier.

Ce qui donne :


Je vais m’arrêter ici pour cet article, le but étant de vous faire prendre conscience que le développement d’un script nécessite de la réflexion pour aboutir à quelque chose de complet qui va couvrir un maximum de cas.

Si vous souhaitez l’améliorer c’est possible voici ce qui pourrait être ajouté :

  • Stocké dans une variable le type de lancement (silencieux / interactif)
  • Si le script est interactif et que le groupe n’existe pas, demander une nouvelle saisie utilisateur

Bon courage pour vos futur script.