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
CLIENT01etCLIENT02
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)
- Sur le DC et les clients, activez PowerShell Remoting avec la commande appropriée.
- 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 avecNew-PSSessionpour ce travail. Des points seront retirés si vous utilisezEnter-PSSessionouInvoke-Commandavec le paramètreComputerName. - Exécutez
Get-PSSessionpour vérifier que les sessions sont bien ouvertes.
À remettre :
- Une capture d'écran montrant la commande
Get-PSSessionavec les sessions ouvertes vers vos deux clients.
Étape B — Préparation du parc (3 pts)
- Créez un fichier texte
hosts.csvqui 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 commandeGet-ADComputer. Enregistrez ce fichier sur le bureau du DC. - Affichez le contenu du fichier
hosts.csvdans le terminal avec la commandeGet-Content(ou un de ses alias commecat) pour vérifier qu'il est correct. Il devrait contenir les noms d'hôte de vos deux clients. - Écrivez un script PowerShell
Check-Hosts.ps1qui 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.csvaffiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat).
- La commande utilisée pour générer le fichier
- Une seconde capture d'écran contenant:
- L'exécution du script
Check-Hosts.ps1montrant les machines du domaine (au moins vos deux clients) et leur statut (En ligne ou Hors ligne). - Le contenu du script
Check-Hosts.ps1affiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat).
- L'exécution du script
É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.
- Créez un fichier texte
config.txtcontenant le texte suivant :
# Configuration File
Setting1=Value1
Setting2=Value2
Setting3=Value3
Enregistrez ce fichier sur le bureau du DC.
Écrivez un script
Deploy-File.ps1qui :- Prend en paramètre une liste de sessions PowerShell distantes (créées à l'étape A).
- Pour chaque machine, copie le fichier
config.txtdu bureau du DC vers le bureau de chaque client en utilisantCopy-Itemavec les sessions distantes.
Exécutez le script
Deploy-File.ps1depuis 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.ps1en passant les sessions distantes en paramètre. - Le contenu du script
Deploy-File.ps1affiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat).
- L'exécution du script
- Une capture d'écran montrant le fichier
config.txtpré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.
- Écrivez un script
Get-Inventory.ps1qui :- 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-Commandavec les sessions distantes :- Nom d’hôte avec
hostname - Nom sur l'OS avec
Get-CimInstance Win32_OperatingSystemet la propriétéCaption - Build sur l'OS avec
Get-CimInstance Win32_OperatingSystemet la propriétéBuildNumber - RAM totale avec
Get-CimInstance Win32_ComputerSystemet la propriétéTotalPhysicalMemory - Le nombre de processeurs logiques avec
Get-CimInstance Win32_ComputerSystemet 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, WinRMet la propriétéStatus
- Nom d’hôte avec
- Exporte les informations récoltées en CSV. Le fichier doit s'appeler
inventaire-baseline-<timestamp>.csvet ê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.
- Exécutez le script
Get-Inventory.ps1depuis 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.ps1affiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat). - L'exécution du script
Get-Inventory.ps1en passant les sessions distantes en paramètre.
- Le contenu du script
- Une capture d'écran du fichier
inventaire-baseline-<timestamp>.csvouvert 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.
- Écrivez un script
Monitor-Performance.ps1qui :- 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-Commandavec les sessions distantes :- Utilisation CPU (%) avec
Get-CimInstance Win32_Processoret la propriétéLoadPercentage - Utilisation RAM (%) avec
Get-CimInstance Win32_OperatingSystemet les propriétésTotalVisibleMemorySizeetFreePhysicalMemory - Espace disque libre sur C: (%) avec
Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'"et les propriétésSizeetFreeSpace
- Utilisation CPU (%) avec
- Exporte les informations récoltées en HTML. Le fichier doit s'appeler
supervision-performance-<timestamp>.htmlet ê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 colonneAlert, sinon laissez cette colonne vide.
- Exécutez le script
Monitor-Performance.ps1depuis 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.ps1affiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat). - L'exécution du script
Monitor-Performance.ps1en passant les sessions distantes en paramètre.
- Le contenu du script
- Une capture d'écran du fichier
supervision-performance-<timestamp>.htmlouvert 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.
- Écrivez un script
Audit.ps1qui :- 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-Commandavec les sessions distantes :- Liste des logiciels installés et leur date d'installation avec
Get-CimInstance Win32_Productet les propriétésNameetInstallDate - Les 20 derniers événements d’erreur du journal système avec
Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 20et les propriétésTimeCreatedetMessage - État du pare-feu Windows pour chaque profil (Domaine, Privé, Public) avec
Get-NetFirewallProfileet la propriétéEnabled
- Liste des logiciels installés et leur date d'installation avec
- Effectue les vérifications suivantes en créant un rapport d'audit nommé
audit-report-<timestamp>.txtenregistré 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]".
- Exécutez le script
Audit.ps1depuis 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.ps1affiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat). - L'exécution du script
Audit.ps1en passant les sessions distantes en paramètre.
- Le contenu du script
- Une capture d'écran du fichier
audit-report-<timestamp>.txtouvert 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)
- Ré-exécutez les scripts écrits aux étapes D et F (
Get-Inventory.ps1etAudit.ps1). - Assurez-vous que vos scripts fonctionnent bien, soit que:
Get-Inventory.ps1détecte que le service W32Time est "Stopped" sur CLIENT01.Audit.ps1détecte que le pare-feu est désactivé pour le profil Privé sur CLIENT02.Audit.ps1liste les événements d'erreur récents dans le rapport d'audit.
- 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>.csvouvert 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>.txtouvert 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.
- Téléchargez l'installateur de Notepad++ depuis le site officiel : Notepad++. Choisissez la version "Installer" (fichier
.exe). - Écrivez un script
Deploy-NotepadPP.ps1qui :- 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-Itemavec 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-Processavec les sessions distantes. L'option pour une installation silencieuse est généralement/S(S majuscule) ou/silent.
- Exécutez le script
Deploy-NotepadPP.ps1depuis le DC en lui passant en paramètre les sessions distantes créées à l'étape A. - 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.ps1affiché dans le terminal avec la commandeGet-Content(ou un de ses alias commecat). - L'exécution du script
Deploy-NotepadPP.ps1en passant les sessions distantes en paramètre.
- Le contenu du script
- 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)