Travail pratique 1 - Administration Windows à distance avec PowerShell

Contexte

Vous êtes technicien·ne en administration système chez MaisonVieux Inc.. On vous a donné une suite de tâches à accomplir pour automatiser l’inventaire, l’audit, la remédiation et la supervision des postes clients Windows dans le domaine.

L’environnement se compose d’un contrôleur de domaine (DC) et de 2 clients Windows tout juste installés.

Remise

  • Ce laboratoire compte pour 20% de la note finale du cours et est à réaliser individuellement.
  • La remise de ce laboratoire se fait en envoyant une seule fois vos réponses dans ce formulaire : Formulaire de remise du TP1
  • Il sera indiqué tout au long de l'énoncé ce qu'il faut remettre pour chaque étape.
  • La date limite de remise est :
    • Le lundi 6 octobre 2025 à 23h59Le lundi 13 octobre 2025 à 23h59 pour le groupe 1 (lundi matin)
    • Le mercredi 8 octobre 2025 à 23h59 pour le groupe 2 (mercredi matin)

Une pénalité de 10% par jour de retard s'applique. Après 5 jours, cette pénalité est de 100%.

Captures d'écran

Vous devrez remettre vos captures d'écran par un formulaire MS Forms.

  • Vos captures d'écran doivent être complètes. Je dois voir l'intégralité de votre écran et non une portion isolée ou uniquement votre terminal. Si vous avez un double écran, capturez seulement l'écran où la fenêtre de VMWare Workstation (ou VirtualBox) se trouve.
  • Le texte doit être lisible si je fais un zoom sur l'image.
  • L'heure et la date doivent être visibles (barre des tâches de la machine hôte).
  • L'invite de commandes doit contenir votre nom (donc votre nom d'utilisateur et/ou le nom de votre machine doit contenir votre nom) pour que je puisse vous identifier au moment de la correction.

Si votre capture d'écran ne contient pas votre nom et/ou vos captures d'écran ne sont pas complètes, votre travail sera refusé.

Plagiat et tricherie

Ce travail est à réaliser individuellement.

Ce qui est autorisé:

  • L'entraide entre étudiants sous forme de conseils, d'explications de concepts, de résolution de problèmes techniques.
  • La consultation de ressources en ligne pour comprendre les concepts et les commandes nécessaires à la réalisation des tâches.

Ce qui n'est pas autorisé:

  • Copier le travail d'un autre étudiant, que ce soit partiellement ou en totalité.
  • Partager vos scripts ou vos captures d'écran avec un autre étudiant.
  • Utiliser des scripts trouvés en ligne sans les comprendre et les adapter à votre contexte. Si vous remettez un script que vous n'avez pas écrit vous-même, vous devez être capable de l'expliquer en détails et de justifier chaque ligne de code. Si le professeur a des doutes sur l'authenticité de votre travail, et/ou si les connaissances utilisées pour réaliser le travail vont au-delà de ce qui a été vu en cours, le professeur se réserve le droit de vous interroger oralement sur le contenu de votre travail pour en vérifier l'authenticité.

Étape 0: Préparation de l'environnement

Pour ce travail, vous devrez disposer d'un environnement de machines virtuelles avec :

  • 1 Contrôleur de domaine Windows Server 2022 ou 2025, appelée DC01
  • 2 Clients Windows 10 ou 11 ou Windows Server 2022 ou 2025 appelées CLIENT01 et CLIENT02

Vos VMs peuvent être hébergées sur votre ordinateur local, sur un serveur de l'école ou même sur un service de cloud (Azure, AWS, GCP, etc.). L'important est qu'ils soient sur le même domaine Active Directory. Si vous hébergez vos VMs sur votre ordinateur local, vous pouvez suivre les instructions pour l'installation de Windows Server. Pour héberger les machines virtuelles sur les serveurs de l'école, utilisez les notions apprises dans le cours Virtualisation.

Si vous avez des difficultés pour la création des VMs, n'hésitez pas à contacter le professeur plusieurs jours avant la date de remise. Il ne sera pas possible d'aider le jour même ou la veille de la remise.

Une fois vos machines virtuelles créées, créez un domaine Active Directory VOTRE-NOM-TP1-5R3.local sur votre contrôleur de domaine et joignez les clients au domaine. Si vous avez besoin d'aide pour cette étape, consultez les notes Mise en place de la semaine 04.

Étape A — Activer PowerShell Remoting (2 pts)

  1. Sur le DC et les clients, activez PowerShell Remoting avec la commande appropriée.
  2. Ouvrez une session PowerShell distante depuis le DC vers chacun des clients avec la commande New-PSSession. Important: Attention de bien utiliser des sessions persistantes avec New-PSSession pour ce travail. Des points seront retirés si vous utilisez Enter-PSSession ou Invoke-Command avec le paramètre ComputerName.
  3. Exécutez Get-PSSession pour vérifier que les sessions sont bien ouvertes.

À remettre :

  • Une capture d'écran montrant la commande Get-PSSession avec les sessions ouvertes vers vos deux clients.

Étape B — Préparation du parc (3 pts)

  1. Créez un fichier texte hosts.csv qui contient les noms d'hôte de tous les membres du domaine. Vous ne devez pas créer ce fichier manuellement. Il doit être généré automatiquement en utilisant la commande Get-ADComputer. Enregistrez ce fichier sur le bureau du DC.
  2. Affichez le contenu du fichier hosts.csv dans le terminal avec la commande Get-Content (ou un de ses alias comme cat) pour vérifier qu'il est correct. Il devrait contenir les noms d'hôte de vos deux clients.
  3. Écrivez un script PowerShell Check-Hosts.ps1 qui lit ce fichier et vérifie que chaque machine est joignable (ping). Si une machine ne répond pas, affichez le nom de la machine suivi de "Hors ligne", sinon affichez le nom de la machine suivi de "En ligne".

Attention: Ici, votre script s'exécute uniquement sur le DC. Vous ne devez pas utiliser de sessions distantes dans ce script.

Note: Si une machine ne répond pas au ping, vérifiez que le pare-feu Windows sur cette machine autorise bien les requêtes ICMP (ping) avec la commande Enable-NetFirewallRule -Name 'FPS-ICMP4-ERQ-In'.

À remettre :

  • Une première capture d'écran contenant:
    • La commande utilisée pour générer le fichier hosts.csv.
    • Le contenu du fichier hosts.csv affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).
  • Une seconde capture d'écran contenant:
    • L'exécution du script Check-Hosts.ps1 montrant les machines du domaine (au moins vos deux clients) et leur statut (En ligne ou Hors ligne).
    • Le contenu du script Check-Hosts.ps1 affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).

Étape C - Déploiement d'un fichier (4 pts)

On vous demande de déployer un fichier de configuration sur chaque client. Le fichier s'appelle config.txt et doit être copié sur le bureau de chaque client.

  1. Créez un fichier texte config.txt contenant le texte suivant :
# Configuration File
Setting1=Value1
Setting2=Value2
Setting3=Value3

Enregistrez ce fichier sur le bureau du DC.

  1. Écrivez un script Deploy-File.ps1 qui :

    • Prend en paramètre une liste de sessions PowerShell distantes (créées à l'étape A).
    • Pour chaque machine, copie le fichier config.txt du bureau du DC vers le bureau de chaque client en utilisant Copy-Item avec les sessions distantes.
  2. Exécutez le script Deploy-File.ps1 depuis le DC en lui passant en paramètre les sessions distantes créées à l'étape A.

À remettre :

  • Une capture d'écran contenant:
    • L'exécution du script Deploy-File.ps1 en passant les sessions distantes en paramètre.
    • Le contenu du script Deploy-File.ps1 affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).
  • Une capture d'écran montrant le fichier config.txt présent sur le bureau de chaque client. (2 captures d'écran au total, une pour chaque client)

Étape D — Inventaire initial des machines (8 pts)

On vous demande de réaliser un inventaire initial des machines en récoltant des informations de base sur chaque client.

  1. Écrivez un script Get-Inventory.ps1 qui :
    • Prend en paramètre une liste de sessions PowerShell distantes (créées à l'étape A).
    • Pour chaque machine, collecte les informations suivantes en utilisant Invoke-Command avec les sessions distantes :
      • Nom d’hôte avec hostname
      • Nom sur l'OS avec Get-CimInstance Win32_OperatingSystem et la propriété Caption
      • Build sur l'OS avec Get-CimInstance Win32_OperatingSystem et la propriété BuildNumber
      • RAM totale avec Get-CimInstance Win32_ComputerSystem et la propriété TotalPhysicalMemory
      • Le nombre de processeurs logiques avec Get-CimInstance Win32_ComputerSystem et la propriété NumberOfLogicalProcessors
      • Espace disque libre sur C: avec Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'" et la propriété FreeSpace
      • Le status des services Spooler, W32Time et WinRM avec Get-Service -Name Spooler, W32Time, WinRM et la propriété Status
    • Exporte les informations récoltées en CSV. Le fichier doit s'appeler inventaire-baseline-<timestamp>.csv et être enregistré sur le bureau du DC. Il doit avoir les colonnes suivantes : Hostname, OS, Build, TotalRAM_GB, LogicalProcessors, FreeSpace_C_GB, SpoolerStatus, W32TimeStatus, WinRMStatus.
  2. Exécutez le script Get-Inventory.ps1 depuis le DC en lui passant en paramètre les sessions distantes créées à l'étape A.

À remettre :

  • Une capture d'écran contenant:
    • Le contenu du script Get-Inventory.ps1 affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).
    • L'exécution du script Get-Inventory.ps1 en passant les sessions distantes en paramètre.
  • Une capture d'écran du fichier inventaire-baseline-<timestamp>.csv ouvert dans Bloc-notes (activez le retour à la ligne dans le menu Format -> Retour automatique à la ligne).

Étape E - Supervision de performance et espace disque (6 pts)

On vous demande de superviser la performance des machines et l'espace disque disponible.

  1. Écrivez un script Monitor-Performance.ps1 qui :
    • Prend en paramètre une liste de sessions PowerShell distantes (créées à l'étape A).
    • Pour chaque machine, collecte les informations suivantes en utilisant Invoke-Command avec les sessions distantes :
      • Utilisation CPU (%) avec Get-CimInstance Win32_Processor et la propriété LoadPercentage
      • Utilisation RAM (%) avec Get-CimInstance Win32_OperatingSystem et les propriétés TotalVisibleMemorySize et FreePhysicalMemory
      • Espace disque libre sur C: (%) avec Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'" et les propriétés Size et FreeSpace
    • Exporte les informations récoltées en HTML. Le fichier doit s'appeler supervision-performance-<timestamp>.html et être enregistré sur le bureau du DC. Il doit avoir les colonnes suivantes : Hostname, CPU_Usage_Percent, RAM_Usage_Percent, FreeSpace_C_Percent, Alert.
    • Si l'utilisation CPU ou RAM dépasse 80%, ou si l'espace disque libre sur C: est inférieur à 20%, mettez un ! dans la colonne Alert, sinon laissez cette colonne vide.
  2. Exécutez le script Monitor-Performance.ps1 depuis le DC en lui passant en paramètre les sessions distantes créées à l'étape A.

À remettre :

  • Une capture d'écran contenant:
    • Le contenu du script Monitor-Performance.ps1 affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).
    • L'exécution du script Monitor-Performance.ps1 en passant les sessions distantes en paramètre.
  • Une capture d'écran du fichier supervision-performance-<timestamp>.html ouvert dans un navigateur.

Étape F - Audit avancé (5 pts)

<!-- Note pour année prochaine: rajouter un timestamp pour chaque ligne de rapport. Aussi, certains etudiatns avaient deja le pare feu descativté dans la premiere capture donc cela rendait la capture H2 désuete. Il faudrait plus miser sur Simulated Lab Error (peut etre faire un rapport juste sur les erreurs et enlever les logiciels et les pare-feus)-->

Puisqu'il y a eu des problèmes de sécurité récemment, on vous demande de réaliser un audit avancé des machines.

  1. Écrivez un script Audit.ps1 qui :
    • Prend en paramètre une liste de sessions PowerShell distantes (créées à l'étape A).
    • Pour chaque machine, collecte les informations suivantes en utilisant Invoke-Command avec les sessions distantes :
      • Liste des logiciels installés et leur date d'installation avec Get-CimInstance Win32_Product et les propriétés Name et InstallDate
      • Les 20 derniers événements d’erreur du journal système avec Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 20 et les propriétés TimeCreated et Message
      • État du pare-feu Windows pour chaque profil (Domaine, Privé, Public) avec Get-NetFirewallProfile et la propriété Enabled
    • Effectue les vérifications suivantes en créant un rapport d'audit nommé audit-report-<timestamp>.txt enregistré sur le bureau du DC :
      • Si un logiciel a été installé dans les 7 derniers jours, ajoutez une ligne dans le rapport avec le nom de l'ordinateur, le nom du logiciel et la date d'installation.
      • Si un événement d'erreur est arrivé dans les 24 dernières heures, ajoutez une ligne dans le rapport avec le nom de l'ordinateur, la date et le message de l'événement.
      • Si le pare-feu est désactivé pour un profil, ajoutez une ligne dans le rapport avec le nom de l'ordinateur et le message "Pare-feu désactivé pour [Nom du Profil]".
  2. Exécutez le script Audit.ps1 depuis le DC en lui passant en paramètre les sessions distantes créées à l'étape A.

À remettre :

  • Une capture d'écran contenant:
    • Le contenu du script Audit.ps1 affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).
    • L'exécution du script Audit.ps1 en passant les sessions distantes en paramètre.
  • Une capture d'écran du fichier audit-report-<timestamp>.txt ouvert dans Bloc-notes.

Étape G - Simulation de dérive

Jusqu'à maintenant, tout allait bien, mais on vous informe que des modifications non autorisées ont été faites sur les clients. Afin de simuler cette dérive, vous allez devoir faire les modifications suivantes sur chaque client en vous connectant directement sur chaque machine (pas en PowerShell distant) :

  • Désactivez le service W32Time sur CLIENT01.
  • Désactivez le pare-feu Windows pour le profil Privé sur CLIENT02.
  • Forcez la création d'au moins un événement d'erreur dans le journal système sur chaque client en utilisant la commande suivante dans une invite de commandes élevée (Admin) :
eventcreate /T ERROR /ID 1000 /L System /SO LabAudit /D "Simulated lab error"

Étape H - Reprise de l'inventaire et de l'audit (4 pts)

  1. Ré-exécutez les scripts écrits aux étapes D et F (Get-Inventory.ps1 et Audit.ps1).
  2. Assurez-vous que vos scripts fonctionnent bien, soit que:
    • Get-Inventory.ps1 détecte que le service W32Time est "Stopped" sur CLIENT01.
    • Audit.ps1 détecte que le pare-feu est désactivé pour le profil Privé sur CLIENT02.
    • Audit.ps1 liste les événements d'erreur récents dans le rapport d'audit.
  3. Remédiez les problèmes détectés en réactivant le service W32Time sur CLIENT01 et en réactivant le pare-feu pour le profil Privé sur CLIENT02 en utilisant les sessions PowerShell distantes.

À remettre :

  • Une capture d'écran contenant le contenu du fichier inventaire-baseline-<timestamp>.csv ouvert dans Bloc-notes montrant que le service W32Time est "Stopped" sur CLIENT01.
  • Une capture d'écran contenant le contenu du rapport d'audit audit-report-<timestamp>.txt ouvert dans Bloc-notes montrant que le pare-feu est désactivé pour le profil Privé sur CLIENT02 et les événements d'erreur récents.
  • Une capture d'écran montrant la réactivation du service W32Time sur CLIENT01 et la réactivation du pare-feu pour le profil Privé sur CLIENT02 en utilisant les sessions PowerShell distantes. (une seule capture d'écran avec les deux commandes visibles dans le terminal).

Étape I - Déploiement d'une application (4 pts)

Maintenant que vous avez corrigé les problèmes, on vous demande d'attaquer une autre tâche, soit le déploiement de l'application "Notepad++" sur chaque client.

  1. Téléchargez l'installateur de Notepad++ depuis le site officiel : Notepad++. Choisissez la version "Installer" (fichier .exe).
  2. Écrivez un script Deploy-NotepadPP.ps1 qui :
    • Prend en paramètre une liste de sessions PowerShell distantes (créées à l'étape A).
    • Pour chaque machine, copie l'installateur de Notepad++ du bureau du DC vers le bureau de chaque client en utilisant Copy-Item avec les sessions distantes.
    • S'assurer de l'intégrité du fichier copié en comparant le hash MD5 du fichier source et du fichier destination avec Get-FileHash.
    • Si le hash correspond, exécutez l'installateur en mode silencieux (sans interaction utilisateur) sur chaque client en utilisant Start-Process avec les sessions distantes. L'option pour une installation silencieuse est généralement /S (S majuscule) ou /silent.
  3. Exécutez le script Deploy-NotepadPP.ps1 depuis le DC en lui passant en paramètre les sessions distantes créées à l'étape A.
  4. Vérifiez que Notepad++ est bien installé sur chaque client en les ouvrant localement et en cherchant Notepad++ dans le menu Démarrer.

À remettre :

  • Une capture d'écran contenant:
    • Le contenu du script Deploy-NotepadPP.ps1 affiché dans le terminal avec la commande Get-Content (ou un de ses alias comme cat).
    • L'exécution du script Deploy-NotepadPP.ps1 en passant les sessions distantes en paramètre.
  • Deux captures d'écran (une pour chaque client) montrant Notepad++ ouvert localement sur chaque client.

Étape J - Nettoyage

Pour terminer, n'oubliez pas de fermer les sessions PowerShell distantes ouvertes à l'étape A pour libérer les ressources avec la commande Remove-PSSession.

Étape K - Résumé des manipulations (3 pts)

Votre patron vous demande de faire un résumé de vos manipulations que vous avez fait dans votre journée de travail pour qu'il puisse le lire rapidement. Rédigez un court rapport (environ une demi-page) qui inclut :

  • Les vérifications effectuées (2-3 phrases maximum)
  • Les problèmes détectés et corrigés (2-3 phrases maximum)
  • Les nouvelles configurations ou installations effectuées (1 phrase)
  • Les améliorations à faire sur vos techniques ou sur vos scripts pour la prochaine fois (2-3 phrases maximum)