Outil gratuit · PowerShell
MECM Health Check
Où en est votre site ConfigMgr — en un rapport, sans rien y modifier.
Un script PowerShell, en lecture seule, qui lit votre site Configuration Manager, ses systèmes de site, ses clients et le durcissement de chaque serveur, puis écrit un rapport HTML autonome : ce qui va, ce qui ne va pas, et quoi faire en premier. Le code est publié ci-dessous en entier, à lire avant de le lancer.
Ce que vous obtenez
Un rapport, sept onglets.
Un seul fichier HTML, sans dépendance : il s'ouvre dans n'importe quel navigateur, s'envoie par mail et s'archive. Chaque contrôle dit ce qu'il a mesuré, pourquoi c'est un problème et où est la documentation Microsoft.
Vue d'ensemble
Le taux de conformité, les points critiques en tête, et la liste des priorités dans l'ordre où les traiter.
Serveurs
Chaque système de site avec ses rôles, son espace disque, sa version et ses composants en erreur ou arrêtés.
Clients
Couverture, postes inactifs, stratégie et inventaire périmés, versions du client, co-gestion et workloads, erreurs d'inscription.
Health check
Le site, ses composants, les déploiements, la distribution du contenu, la synchronisation des mises à jour, les ADR, les collections et les messages d'état.
Sécurité du site
Administrateurs complets, compte d'accès réseau, installation poussée, PXE, limites trop larges ou orphelines, séquences de tâches — selon la grille Misconfiguration Manager.
Durcissement serveur
Sur chaque serveur : partages, comptes locaux, mot de passe, services, SMB, NTLM, LLMNR, RDP, WinRM, Defender, Credential Guard, LAPS, journalisation, TLS.
Troubleshooting
Les journaux Configuration Manager de chaque serveur, lus sur sept jours : les erreurs regroupées par cause probable, avec quoi faire, une chronologie, et les messages d'état composant par composant.
Avant de commencer
Les prérequis.
Le strict nécessaire est court : PowerShell et un compte en lecture sur le site. Le reste débloque des parties du rapport — sans lui, le script le dit et continue.
| Prérequis | Pour | Précisions |
|---|---|---|
| RequisWindows PowerShell 5.1 ou PowerShell 7 | Le script tout entier. | Présent d'office sur Windows Server 2016 et suivants. |
| RequisUn compte avec au moins le rôle Read-only Analyst sur le site | Lire le site, ses serveurs et ses clients. | Le compte courant, ou un autre via -Credential. ConfigMgr reconnaît un administrateur à son SID, pas à son nom : un compte supprimé puis recréé sous le même nom n'a plus aucun droit, même s'il apparaît toujours dans la console. Le site répond alors sans rien montrer, et le script s'arrête en le disant — recréez l'utilisateur administratif. |
| RequisUne machine qui joint le fournisseur SMS | Le point d'entrée des lectures. | Le serveur de site lui-même, ou n'importe quel poste du domaine qui le joint : HTTPS 443 (AdminService), sinon WMI par WinRM (5985), sinon par DCOM (135 + ports dynamiques). |
| FacultatifL'AdminService actif | La lecture la plus rapide. | Sans lui, bascule automatique sur WMI. Même rapport. |
| FacultatifWinRM (5985/5986) vers chaque système de site, et administrateur local | Les onglets Durcissement serveur et Troubleshooting. | Ou un endpoint JEA (-HardeningEndpoint). Sans accès : onglet marqué « non collecté », ou -SkipHardening / -SkipLogs. |
| FacultatifUne console PowerShell lancée en administrateur | Le durcissement de la machine locale. | Registre, services et stratégie de mot de passe locaux. |
| FacultatifUne stratégie d'exécution qui autorise un script local | Lancer le fichier. | RemoteSigned suffit pour un fichier créé sur la machine. Sinon, pour cette session seulement : Set-ExecutionPolicy -Scope Process Bypass. |
Le script n'utilise ni le module ConfigurationManager ni la console : il lit l'AdminService en HTTPS, ou WMI, avec les commandes livrées avec Windows. Rien n'est installé, ni sur la machine qui le lance, ni sur les serveurs audités.
Transparence
Ce qu'il lit. Ce qu'il écrit. Ce qu'il ne fait jamais.
Un audit qui modifie ce qu'il audite n'en est plus un. Chaque affirmation ci-dessous se vérifie dans le code, plus bas.
Il lit
- Le site : 23 classes WMI du fournisseur SMS — site, composants, rôles, limites, déploiements, contenu, mises à jour, collections, messages d'état, administrateurs, images de démarrage, et les réglages du site control file : installation par push, compte d'accès réseau, sécurité de communication.
- Les clients : l'inventaire des machines et leur état de co-gestion.
- Chaque serveur : des clés de registre, des services, des groupes locaux, des partages avec leurs permissions de partage et NTFS, la protection étendue des instances SQL Server, les droits du cache client et des réglages réseau.
- L'annuaire : une seule valeur, le quota de comptes ordinateurs du domaine (ms-DS-MachineAccountQuota), en LDAP et en lecture seule.
- Les journaux Configuration Manager de chaque serveur : seulement la fin, seulement les lignes d'erreur et d'avertissement, ouverts en partage pour ne jamais gêner le composant qui les écrit.
Il écrit
- Le rapport HTML, dans le dossier courant ou là où
-OutFilel'indique. - Un JSON des données lues, si vous le demandez (
-ExportJson). - Sur chaque serveur audité, un fichier temporaire
hc_secpol_<guid>.cfgdans le dossier temporaire du compte, produit parsecedit /export, relu puis supprimé aussitôt — Windows n'a pas d'autre moyen de lire la stratégie de mot de passe.-SkipSeceditpour ne rien créer du tout. - Avec la fenêtre d'options, dans le dossier temporaire de la machine qui la lance : un fichier de progression, et — si vous y saisissez un autre compte — ce compte chiffré par Windows (DPAPI, lisible par vous seul sur cette machine), supprimé dès qu'il a été lu.
Il ne fait jamais
- Modifier un réglage, un déploiement, une collection ou un poste : vers le site, il n'envoie que des lectures (requêtes
GETà l'AdminService,Get-CimInstanceen WMI). - Démarrer, arrêter ou reconfigurer un service, ni changer une permission, une clé de registre, un compte ou une valeur de l'annuaire.
- Installer quoi que ce soit, ni localement ni à distance.
- Appeler Internet : aucune requête ne sort de votre réseau. Les liens du rapport pointent vers Microsoft Learn, et ne s'ouvrent que si vous cliquez.
- Envoyer quoi que ce soit à LB IT Cloud. Il n'y a ni télémétrie, ni licence, ni compte.
Les traces qu'il laisse
Rien n'est modifié, mais une lecture se voit, comme celle de n'importe quel administrateur qui consulte :
- les ouvertures de session réseau dans le journal de sécurité Windows des serveurs ;
- les requêtes dans
smsprov.loget, pour l'AdminService, dans les journaux IIS ; - le texte du collecteur dans les journaux PowerShell, si la journalisation des blocs de script est active ;
- le profil du compte sur chaque serveur audité, que PowerShell Remoting crée à la première session s'il n'existait pas ;
- une ligne dans le journal de
secedit(%windir%\security\logs).
Pour ne rien exécuter du tout sur les serveurs et ne lire que le site : -SkipHardening -SkipLogs.
Utilisation
Copier, coller, lancer.
Copier
Coller et enregistrer
Invoke-MecmHealthCheck.ps1. Le fichier est en ASCII : l'encodage choisi à l'enregistrement n'y change rien.Lancer
.\Invoke-MecmHealthCheck.ps1Sans paramètre, une fenêtre s'ouvre : site, compte, ce qui est lu, dossier du rapport — puis elle suit l'exécution et ouvre le rapport à la fin. En ligne de commande, rien ne s'affiche :
.\Invoke-MecmHealthCheck.ps1 -Client "Contoso" -Open
Les paramètres
-SiteServer | Le fournisseur SMS à interroger. Par défaut : cette machine. |
-SiteCode | Code du site. Découvert automatiquement s'il n'est pas donné. |
-Source | Auto (AdminService puis WMI), AdminService ou Wmi. |
-Credential | Un autre compte pour le site et le durcissement. |
-MessageHours | Fenêtre des messages d'état, 0 à 168 h. Défaut : 24. |
-HistoryDays | Historique des messages d'erreur lu pour dater chaque composant, 0 à 90 jours. Défaut : 30. |
-LogDays / -MaxLogMB | Fenêtre de lecture des journaux des serveurs (0 à 60 jours, défaut 7) et taille lue à la fin de chacun (défaut 5 Mo). |
-SkipLogs | Ne lit pas les journaux des serveurs. |
-SkipClients | Ne lit pas les clients. |
-SkipHardening | Ne collecte pas le durcissement. |
-HardeningHosts | Limite le durcissement à ces machines. |
-SkipSecedit | Ne crée aucun fichier, même temporaire, sur les serveurs. |
-ScanShares | Cherche aussi des fichiers sensibles (mots de passe, .kdbx, unattend.xml) dans les partages. |
-Language | fr (défaut) ou en. |
-Client | Le nom imprimé sur le rapport. |
-OutFile / -ExportJson / -Open | Où écrire le rapport, s'il faut aussi le JSON, et s'il faut l'ouvrir. |
-Gui / -Silent | Force la fenêtre d'options (pré-remplie par les autres paramètres), ou l'interdit — pour une tâche planifiée. Sans l'un ni l'autre, elle ne s'ouvre que si le script est lancé sans aucun paramètre, sur un bureau interactif. |
Sans paramètre
Une fenêtre pour régler le health check.
Lancé sans paramètre sur un bureau, le script ouvre cette fenêtre : le site, le compte, ce qui est lu et où écrire le rapport. Puis la même fenêtre suit l'exécution, phase par phase, et donne le verdict. Cliquez : c'est la même fenêtre, en français comme dans le script.
Health check MECM
Lit le site Configuration Manager, ses serveurs, ses clients et le durcissement de chaque système de site, puis écrit un rapport HTML. Lecture seule : rien n'est modifié, rien n'est déployé.
La même chose, en ligne de commande
Chaque choix de la fenêtre a son paramètre. La ligne ci-dessous suit vos clics : c'est celle à mettre dans une tâche planifiée ou une session à distance. Le rapport est alors écrit dans le dossier courant, ou là où l'indique -OutFile.
.\Invoke-MecmHealthCheck.ps1 -Open
La fenêtre ne s'ouvre jamais là où elle pourrait bloquer un traitement sans surveillance :
- dès qu'un paramètre est passé : une ligne de commande est une intention explicite.
-Guil'ouvre quand même, pré-remplie par les autres paramètres ; - sous SYSTEM, ni dans une session sans bureau ;
- avec
-Silent, pour une tâche planifiée lancée sans autre paramètre.
Le health check tourne dans un second processus PowerShell, lancé par la fenêtre avec ces mêmes paramètres : la fenêtre reste réactive pendant les minutes de lecture, et « Annuler » l'arrête net. Lancée sans droits d'administrateur, elle prévient que le durcissement de la machine locale sera en partie non mesuré.
Le code
Le script, en entier.
Découpé en sections, chacune expliquée en une phrase. Tout est en clair : pas de bloc encodé, pas de téléchargement caché, pas de ligne qui appelle Internet. Vous pouvez le lancer dans votre organisation comme chez vos clients : ce qui est permis est écrit dans ses conditions d'utilisation.
Invoke-MecmHealthCheck.ps1
Nouveautés · version 1.72.2
Ce qui change dans cette version.
La 1.72.2 rend sa démonstration cohérente, la 1.72.1 donne à la fenêtre d'options la charte du site. Depuis la 1.71.0 : une fenêtre pour le lancer, un lancement à distance validé, des lectures corrigées sur un vrai site de production, et un onglet Sécurité aligné sur Misconfiguration Manager.
Lancement
- Une fenêtre d'options s'ouvre quand le script est lancé sans paramètre : site, compte, ce qui est lu, dossier du rapport — puis elle suit l'exécution en direct.
-Guila force,-Silentl'interdit. - Le lancement depuis un poste du domaine est validé. Quand le site répond sans rien montrer au compte — rôle manquant, ou compte recréé dont ConfigMgr garde l'ancien SID — le script s'arrête et dit quoi vérifier, au lieu d'écrire un rapport vide.
- Le lancement depuis PowerShell ISE fonctionne.
Lectures corrigées
- Les rôles des systèmes de site sont comptés : ils restaient à zéro sur un vrai site.
- Les messages d'état sont filtrés sur la période aussi par l'AdminService, qui renvoyait jusque-là les plus anciens. Une lecture qui échoue s'affiche « non lu », plus 0.
- L'installation par push est lue là où le site la garde : automatique ou non, contrôleurs de domaine, comptes, repli NTLM. Le compte d'accès réseau est réellement lu.
- Le graphique des déploiements dit quand le site ne renvoie aucun compteur, au lieu d'annoncer « aucun échec ».
Sécurité
- Une matrice des 23 mesures PREVENT de Misconfiguration Manager : pour chacune, le contrôle qui la mesure et son statut, ou la raison pour laquelle elle ne se mesure pas depuis le site.
- Cinq nouveaux contrôles : correctif KB15599094 du push (PREVENT-1), invite F8 des images de démarrage (PREVENT-7), protection étendue de SQL Server (PREVENT-14), quota de comptes ordinateurs du domaine (PREVENT-16), droits sur le cache du client (PREVENT-23).
- Les partages sont jugés sur leurs permissions de partage ET NTFS, comparées à la référence de chaque produit (ConfigMgr, WSUS, WDS) : une écriture ouverte à un groupe large est critique.
Rapport
- Disques : orange au-delà de 80 % utilisés, rouge au-delà de 95 %, et des barres qui montrent l'espace utilisé.
- Clients : une tuile « Clients sains » — actifs, santé du client correcte, stratégie et inventaire récents.
- Le rapport porte la charte LB IT Cloud, et la carte des serveurs ne se chevauche plus.
- 1.72.1 — la fenêtre d'options aussi : plaque en tête, coins taillés, titres étroits, étiquettes en chasse fixe, boutons en capitales.
- 1.72.2 — le rapport de démonstration retrouve ses messages d'état et sa chronologie : rejoué, un jeu d'essai est daté du jour où il a été enregistré.
- Les commentaires du script sont en anglais et en français.