| Scroll Ignore |
|---|
| scroll-pdf | true |
|---|
| scroll-office | true |
|---|
| scroll-chm | true |
|---|
| scroll-docbook | true |
|---|
| scroll-eclipsehelp | true |
|---|
| scroll-epub | true |
|---|
| scroll-html | false |
|---|
|
|
| Info |
|---|
Pack concerné : windows-by-WinRM__shinken Versions : V02.08.00 — script Configure-Host.ps1 V02.08.00 |
Cette page a pour but de décrire la mise en place d'une configuration minimale pour une machine Windows afin qu'elle puisse être supervisée par Vous retrouverez dans cette page les erreurs rencontrées lors de la configuration d'un Windows supervisé pour le pack windows-by-WinRM__shinken : exécution du script, service WinRM, compte de supervision, permissions et Active Directory..
|
|
|---|
| Pour qui ? | Administrateur Windows, du débutant au confirmé |
| Durée | 1 à 10 minutes avec le script, ~45 minutes en manuel |
| Ce dont vous avez besoin | Un accès administrateur sur la machine à superviser |
| Résultat attendu | - Un compte de supervision dédié
- Le service WinRM prêt à répondre au poller Shinken
- Un pare-feu configuré
|
Ce guide couvre la configuration machine par machine. Il vous permet de :
- Tester le pack en moins de 10 minutes, à petite échelle, avant un déploiement plus large
- Configurer un petit parc de machines et l'exploiter directement
Impossible de charger le fichier <nom_du_script.ps1> car l'exécution de scripts est désactivée
Le script Configure-Host.ps1 refuse de démarrer. PowerShell bloque par défaut les scripts non signés numériquement via sa stratégie d'exécution (Execution Policy). Aucune modification n'a été appliquée sur la machine.
| Code Block |
|---|
|
Impossible de charger le fichier C:\<nom_du_script.ps1>, car l'exécution de scripts
est désactivée sur ce système.
+ CategoryInfo : Erreur de sécurité : (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess |
Mots-clés : UnauthorizedAccess · PSSecurityException · Execution Policy · l'exécution de scripts est désactivée · n'est pas signé numériquement
| Panel |
|---|
Image Removed |
Autorisez l'exécution pour la session courante uniquement :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
Set-ExecutionPolicy Unrestricted -Scope Process |
| Info |
|---|
-Scope Process ne modifie que la fenêtre PowerShell ouverte : aucun impact persistant sur la machine, la stratégie d'origine est rétablie à la fermeture. Pour connaître la stratégie en vigueur :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
| Get-ExecutionPolicy -List |
|
WSManFault – Le type de connexion réseau défini sur cet ordinateur est Public
| Tip |
|---|
Conseil : même si vous devez équiper un parc entier : - Vous pouvez passer par cette page pour valider le fonctionnement sur une machine de test.
- Vous passerez ensuite à la configuration par domaine, qui offre une gestion centralisée, contrôlable et révocable.
|
Interactions entre WinRM et le pack windows-by-WinRM__shinken
| Anchor |
|---|
| procedure_de_configuration |
|---|
| procedure_de_configuration |
|---|
|
La supervision d'un Windows par un poller Shinken repose sur des requêtes WinRM :
| Panel |
|---|
Image Added
|
- Côté poller Shinken — la sonde WinRM envoie les requêtes et traite les réponses.
- Côté Windows supervisé — le service WinRM reçoit les requêtes et y répond.
- WinRM récupère les informations exposées par WMI (Windows Management Instrumentation).
Il faut donc configurer deux choses sur chaque machine supervisée :
- Le service WinRM (démarrage, écouteur, pare-feu, authentification)
- Un compte de supervision dédié, avec uniquement les droits nécessaires
| Warning |
|---|
N'utilisez pas le compte Administrateur pour la supervision. Il fonctionnerait (il a tous les droits), mais c'est une mauvaise pratique de sécurité. Créez un compte dédié : c'est exactement ce que fait le script. |
Prérequis
| Anchor |
|---|
| configuration_de_winrm |
|---|
| configuration_de_winrm |
|---|
|
Vérifiez ces trois points avant de commencer.
1. Version de Windows supportée
Le Windows supervisé doit correspondre à une des versions suivantes :
| Excerpt |
|---|
| Postes de travail | Serveurs |
|---|
| Windows 11 | Windows Server 2025 | | Windows 10 | Windows Server 2022 |
| Windows Server 2019 |
| Windows Server 2016 |
| Windows Server 2012 R2 |
|
PowerShell 4.0 ou supérieur est également requis.
2. Une langue compatible installée
La sonde interprète les réponses de Windows : au moins une de ces deux langues doit être installée sur la machine.
- Français (
fr-FR) - Anglais (
en-US)
| Warning |
|---|
Ce prérequis s'applique aux deux méthodes, script compris. Le script vérifie la langue à son étape 1 et s'arrête immédiatement si aucune n'est présente : rien n'est configuré dans ce cas. Il n'installe pas la langue lui-même, car la méthode d'installation dépend de la version de Windows et nécessite parfois le média d'installation. |
Pour vérifier — sur toutes les versions de Windows :winrm quickconfig s'interrompt sans configurer WinRM. Windows refuse d'activer la gestion à distance tant qu'au moins une carte réseau est en profil Public. Le cas est fréquent sur Windows 10 et Windows 11, où une carte non identifiée bascule automatiquement dans ce profil.
| Code Block |
|---|
|
WSManFault
Message = Le client WinRM ne peut pas traiter la demande. Le type de connexion réseau
défini sur cet ordinateur est Public. Dans ce type de réseau, le pare-feu bloque le
pilote WinRM.
Error number: -2144108183 0x80338169 |
Mots-clés : WSManFault · 0x80338169 · -2144108183 · connexion réseau · Public · le pare-feu bloque le pilote WinRM
| Info |
|---|
Survient à l'étape : Étape 4 — Lancer le script, ou B.1 en configuration manuelle — voir Prérequis sur la page de configuration. |
| Panel |
|---|
Image Removed |
Identifiez la carte concernée :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
Get-NetConnectionProfile |
Basculez-la en Privé (ou Domaine si la machine est jointe à un annuaire), en remplaçant le nom de l'interface :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
Set-NetConnectionProfile -InterfaceAlias "Ethernet" -NetworkCategory Private |
| Panel |
|---|
Image Removed |
| Note |
|---|
Sur un serveur en production, ce changement de profil peut modifier les règles de pare-feu appliquées. Vérifiez vos politiques internes avant de le réaliser. |
Service WinRM, compte et permissions
Le service WinRM est arrêté après chaque redémarrage
La supervision fonctionne, puis tous les checks de la machine tombent en erreur après un redémarrage. Sur Windows 10 et Windows 11, le service WinRM est configuré en démarrage manuel par défaut : il ne se relance pas tout seul.
| Code Block |
|---|
|
Status Name DisplayName
------ ---- -----------
Stopped WinRM Gestion à distance de Windows (Gestion WS) |
Mots-clés : WinRM · Stopped · StartupType · Manual · connection refused · request timed out
| Info |
|---|
Survient à l'étape : Prérequis — 3. Le service WinRM est actif — voir Prérequis sur la page de configuration. |
| Panel |
|---|
Image Removed |
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
Set-Service -Name WinRM -StartupType Automatic
Start-Service WinRM
Get-Service WinRM |
| Panel |
|---|
Image Removed |
| Info |
|---|
Côté Shinken, cette panne se manifeste par une erreur Transport error : connection refused ou request timed out sur tous les checks de l'hôte. |
Le nom de groupe local spécifié est introuvable – net localgroup
L'ajout du compte de supervision à un groupe local échoue après un copier-coller, alors que le nom du groupe paraît correct à l'écran. La cause est une apostrophe typographique (’) substituée à l'apostrophe droite (') au moment du collage par clic droit, dans « Utilisateurs de l'Analyseur de performances ».
| Code Block |
|---|
|
Le nom de groupe local spécifié est introuvable.
D'autres informations sont disponibles à l'adresse NET HELPMSG 3763. |
Mots-clés : net localgroup · NET HELPMSG 3763 · nom de groupe local introuvable · Analyseur de performances · Performance Monitor Users · apostrophe
| Panel |
|---|
[Capture à insérer : la commande échouée dans la console] |
- Collez avec CTRL+V plutôt qu'avec le clic droit, ou
- saisissez l'apostrophe manuellement dans la console, ou
- utilisez le nom anglais du groupe, qui ne contient pas d'apostrophe :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
net localgroup "Performance Monitor Users" shinken_user /ADD |
Pour vérifier l'appartenance effective du compte :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
net user shinken_user |
La supervision s'arrête brutalement du jour au lendemain
Tous les checks d'une machine — ou de l'ensemble du parc si le compte est partagé — passent en erreur simultanément, sans qu'aucune configuration n'ait été modifiée. Le mot de passe du compte de supervision a expiré conformément à la politique de sécurité du domaine ou de la machine.
| Code Block |
|---|
|
UNKNOWN – Authentication NTLM failed : Unauthorized |
Mots-clés : Authentication failed · Unauthorized · mot de passe expiré · PasswordExpired · PasswordNeverExpires
| Panel |
|---|
Image Removed
|
Vérifiez l'état du compte :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
net user shinken_user | findstr /C:"expire" |
Redéfinissez le mot de passe, puis empêchez son expiration :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
$secPass = ConvertTo-SecureString "VotreMotDePasse" -AsPlainText -Force
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -PasswordNeverExpires |
| Warning |
|---|
Si le mot de passe est déjà expiré, activer -PasswordNeverExpires ne suffit pas à débloquer le compte : il faut aussi redéfinir le mot de passe. Pensez à le mettre à jour dans le Synchronizer côté Shinken. |
Les permissions ne semblent pas prises en compte
C'est exactement le contrôle effectué par le script à son étape 1. Il liste les langues du compte courant.
Après avoir exécuté la commande, cherchez LanguageTag : en-US ou LanguageTag : fr-FR :
| Code Block |
|---|
|
LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin
InputMethodTips : {0409:0001040C}
Spellchecking : True
Handwriting : False |
| Note |
|---|
Sur Windows 10, Windows 11 et Windows Server 2025 uniquement, la commande Get-InstalledLanguage donne une vue plus lisible des langues installées sur la machine : | Code Block |
|---|
| Language Language Packs Language Features
-------- -------------- -----------------
en-US LpCab, LXP BasicTyping, Handwriting, Speech, TextToSpeech, OCR
fr-FR LpCab, LXP BasicTyping, Handwriting, Speech, TextToSpeech, OCR |
Elle n'existe pas sur Windows Server 2022, 2019, 2016 et 2012 R2 : utilisez Get-WinUserLanguageList sur ces versions. Seul le code de langue compte (en-US ou fr-FR). Les fonctionnalités listées dans la colonne Language Features — BasicTyping, Handwriting, Speech, TextToSpeech, OCR — ne sont pas requises par le pack : elles apparaissent parce qu'une installation par l'interface graphique les ajoute par défaut. L'option -ExcludeFeatures de Install-Language permet d'ailleurs de toutes les omettre. |
| Info |
|---|
La langue choisie n'influence pas l'affichage des résultats de supervision. Elle conditionne uniquement le bon fonctionnement de la sonde. |
Si aucune des deux langues n'est installée voir Installer une langue.
3. Le service WinRM est actif
WinRM est installé par défaut sur toutes les versions supportées. Vérifiez qu'il tourne :
| Code Block |
|---|
|
Get-Service WinRM |
| Code Block |
|---|
|
Status Name DisplayName
------ ---- -----------
Running WinRM Gestion à distance de Windows (Gest... |
| Note |
|---|
Windows 10 et Windows 11 uniquement — le service n'est pas en démarrage automatique par défaut. Corrigez-le : | Code Block |
|---|
| Set-Service -Name WinRM -StartupType Automatic |
|
Méthode A — Configuration par script (recommandée)
Le script Configure-Host.ps1 exécute toutes les étapes de la méthode manuelle en une seule commande. Il doit être lancé sur chaque machine à superviser.
À lire avant d'exécuter le script
| Point de vigilance | Détail |
|---|
| Modifications système | Le script modifie WinRM, WMI, les services et les permissions. |
| Testez d'abord | Validez sur une machine de test ou un serveur non critique avant la production. |
| Droits administrateur | Obligatoires. Sans eux, la configuration sera partielle ou en erreur. |
| Impact sécurité | Activer WinRM ouvre un port d'administration à distance : vérifiez vos politiques internes. Le script rappelle les implications de chaque méthode d'authentification avant de vous laisser choisir. |
| Compatibilité | L'installation automatique des langues ne fonctionne que sur Windows 10, 11 et Server 2025. Ailleurs, installez la langue manuellement. |
| Responsabilité | L'exécution reste sous la responsabilité de l'administrateur. |
- Vérifie qu'une langue compatible (anglais ou français) est installée.
- Crée l'utilisateur de supervision et l'ajoute aux groupes nécessaires (Remote Management Users, Performance Monitor Users, Event Log Readers).
- Configure la langue de cet utilisateur.
- Configure WinRM : authentification Negotiate ou Basic puis l'écouteur HTTP.
- Autorise l'utilisateur à exécuter des commandes WinRM.
- Donne l'accès WMI/CIM à
root\cimv2. - Donne l'accès WMI/CIM à
root\standardcimv2. - Donne l'accès en lecture au journal de sécurité (Security Event Log).
- Donne l'accès au service
W32Time (service NTP de Windows). - Donne l'accès en lecture au statut d'une liste configurable de services.
- Redémarre les services
winmgmt et WinRM pour appliquer les modifications.
Étape 1 — Récupérer le script
Le script est livré dans le pack, sous le répertoire supervised-host/.
Vous pouvez aussi le télécharger ici : Configure-Host.ps1
Étape 2 — Déployer le script sur la machine
| Tip |
|---|
Pour une seule machine, le plus simple est de télécharger le script directement depuis cette page (lien à l'étape 1), puis de le copier sur la machine à superviser. Les méthodes ci-dessous concernent le déploiement sur plusieurs machines. |
La méthode dépend de votre environnement et de vos outils (SSH, FTP, cloud, Docker, Ansible, Terraform...). Nous vous recommandons d'utiliser vos propres solutions de déploiement, adaptées à vos enjeux de sécurité.
Exemple : déploiement via SSH
Si la machine Windows dispose déjà d'un serveur SSH :
| Code Block |
|---|
|
scp supervised-host/Configure-Host.ps1 Administrateur@<IP_HOST>:C:/Users/Administrateur/ |
Étape 3 — Autoriser l'exécution du script
| Anchor |
|---|
| autoriser_execution_script |
|---|
| autoriser_execution_script |
|---|
|
Par défaut, PowerShell bloque l'exécution des scripts non signés ( stratégie d'exécution / Execution Policy ). Vous obtiendrez alors une erreur de ce type :
| Panel |
|---|
Image Added
|
Solution — lever la restriction pour la session en cours uniquement :
| Code Block |
|---|
|
Set-ExecutionPolicy Unrestricted -Scope Process |
-Scope Process : n'affecte que la fenêtre PowerShell ouverte. Aucun impact persistant sur la machine.Unrestricted : autorise l'exécution des scripts non signés.
Relancez ensuite le script dans le même terminal.
Étape 4 — Lancer le script
| Info |
|---|
Toutes les commandes doivent être exécutées dans un PowerShell lancé en tant qu'administrateur. |
Le script détecte automatiquement si la machine est jointe à un domaine et adapte son comportement. Choisissez le mode qui vous convient :
| Mode | Commande | Quand l'utiliser |
|---|
| Par défaut | .\Configure-Host.ps1 -Default | Pour tester rapidement le pack |
| Assistant | .\Configure-Host.ps1 -Interactive | Pour une configuration guidée |
| Paramétré | .\Configure-Host.ps1 -UserName ... -Password ... | Pour un déploiement automatisé |
| Aide | .\Configure-Host.ps1 -Help | Pour afficher l'aide complète |
| Version | .\Configure-Host.ps1 -Version | Pour connaître la version du script |
| Info |
|---|
Le mode domaine est détecté automatiquement : inutile de préciser -Domain sur une machine jointe au domaine. Utilisez -Local uniquement pour forcer la création d'un compte local sur une machine pourtant jointe au domaine. -Domain et -Local sont mutuellement exclusifs : les indiquer ensemble arrête le script.
|
| Info |
|---|
Identifiants d'annuaire — le script utilise votre session courante si elle a les droits d'écriture dans l'annuaire, et vous les demande en mode -Interactive. Ajoutez -DomainCredential $cred uniquement pour un lancement automatisé (à distance ou par tâche planifiée), où aucune invite ne doit bloquer. |
| Tip |
|---|
Mot de passe : le script accepte un SecureString (recommandé) ou une simple chaîne de caractères. Pour préparer un SecureString : | Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
| $secPass = ConvertTo-SecureString "VotreMotDePasse" -AsPlainText -Force |
|
Variantes possibles :
| Commande | Ce qu'elle fait |
|---|
.\Configure-Host.ps1 -Default | Mode domaine ou workgroup détecté automatiquement selon l'appartenance de la machine. |
.\Configure-Host.ps1 -Default -Local | Force la création d'un compte local, même sur une machine jointe à un domaine. |
.\Configure-Host.ps1 -Default -Domain | Force le mode Active Directory : crée shinken_user et le groupe shinken_monitoring dans l'OU dédiée. Échoue si la machine n'est pas membre d'un domaine. |
.\Configure-Host.ps1 -Default -Domain -OUPath "OU=Serveurs,DC=exemple,DC=local" | Idem, mais l'OU dédiée est créée sous l'OU indiquée au lieu de la racine du domaine. |
.\Configure-Host.ps1 -Default -Domain -DomainCredential $cred | Idem, avec des identifiants d'annuaire explicites (lancement à distance, tâche planifiée). |
| Code Block |
|---|
|
.\Configure-Host.ps1 -Default |
Valeurs appliquées :
| Paramètre | Valeur par défaut |
|---|
UserName | shinken_user |
Password | Ch4nge_Th1s_P4ssw0rd |
Negotiate | true |
Basic | false |
AllowUnencrypted | false |
| Warning |
|---|
Changez impérativement le mot de passe par défaut. Le mode par défaut est fait pour tester le pack, pas pour un environnement exposé. |
| Warning |
|---|
-Default ignore les paramètres de compte, d'authentification et de services. La commande .\Configure-Host.ps1 -Default -UserName mon_compte crée le compte shinken_user, pas mon_compte, et aucune erreur n'est affichée. Pour choisir vos propres valeurs, utilisez le mode paramétré.
|
Mode assistant (interactif)
Variantes possibles :
| Commande | Ce qu'elle fait |
|---|
.\Configure-Host.ps1 -Interactive | Assistant complet. Le mode domaine ou workgroup est détecté automatiquement. |
.\Configure-Host.ps1 -Interactive -Local | Assistant, en forçant la création d'un compte local. |
.\Configure-Host.ps1 -Interactive -Domain | Assistant, en forçant le mode Active Directory : recherche ou création du compte et du groupe dans l'annuaire. |
.\Configure-Host.ps1 -Interactive -Domain -DomainCredential $cred | Idem, en fournissant les identifiants d'annuaire à l'avance plutôt qu'à l'invite. |
| Code Block |
|---|
|
.\Configure-Host.ps1 -Interactive |
Le script vous pose chaque question, une par une. Le mot de passe est saisi de façon masquée.
Exemple sur une machine en Workgroup :
| Panel |
|---|
Image Added
|
Exemple sur une machine Active Directory :
| Panel |
|---|
Image Added
|
Mode paramétré (ligne de commande)
| Anchor |
|---|
| configuration-personnalise-windows-workgroup |
|---|
| configuration-personnalise-windows-workgroup |
|---|
|
Variantes possibles :
| Commande | Ce qu'elle fait |
|---|
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass | Compte local. L'authentification est demandée si elle n'est pas précisée. |
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -Negotiate true | Compte local, authentification Negotiate (recommandée). |
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -Basic true -AllowUnencrypted true | Compte local, authentification Basic. À réserver aux cas où Negotiate est impossible. |
.\Configure-Host.ps1 -ADUserName "shinken_user" -ADGroupName "GRP_SHINKEN" -Password $secPass | Active Directory : utilise un compte et un groupe déjà existants. |
.\Configure-Host.ps1 -ADUserName "shinken_user" -CreateADUser -ADGroupName "GRP_SHINKEN" -CreateADGroup -Password $secPass | Active Directory : crée le compte et le groupe. |
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -ServicesName "MonService","AutreService" | Ajoute des services supplémentaires à superviser, en plus des trois services critiques. |
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -GrantAll | Autorise la lecture sur tous les services. Déconseillé en production. |
Machine en Workgroup :
| Code Block |
|---|
|
$secPass = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -Negotiate true -Basic false -AllowUnencrypted false |
Machine Active Directory — créer le compte et le groupe :
| Code Block |
|---|
|
$secPass = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
.\Configure-Host.ps1 -ADUserName "shinken_user" -CreateADUser -ADGroupName "GRP_SHINKEN" -CreateADGroup -Password $secPass |
Machine Active Directory — utiliser un compte et un groupe qui existent déjà :
| Code Block |
|---|
|
.\Configure-Host.ps1 -ADUserName "shinken_user" -ADGroupName "GRP_SHINKEN" |
Spécificités Active Directory
| Anchor |
|---|
| specificites_active_directory |
|---|
| specificites_active_directory |
|---|
|
| Info |
|---|
Cette page couvre la configuration d'UNE machine. Pour équiper un parc entier via stratégie de groupe (GPO), voir la page dédiée au déploiement en domaine. |
Sur une machine jointe à un domaine, le script détecte l'Active Directory automatiquement. La procédure est la même qu'en workgroup : mêmes prérequis de langue, même script, même configuration WinRM, mêmes tests.
Une seule chose change : au lieu d'un compte local, le script crée un compte ET un groupe dans l'annuaire. Vous n'avez aucune gestion de droits à faire — le script place le groupe dans les groupes locaux nécessaires, et tout fonctionne directement.
| Workgroup | Active Directory |
|---|
| Ce qui est créé | Un compte local | Un compte et un groupe de domaine |
| Qui porte les permissions | Le compte | Le groupe |
| Paramètres à fournir | -UserName | -ADUserName et -ADGroupName |
| Tip |
|---|
Pourquoi un groupe ? Les droits sont posés sur le groupe, pas sur le compte. Changer de compte de supervision plus tard ne demande donc aucune reprise sur les machines : il suffit de placer le nouveau compte dans le groupe. |
Les objets sont créés dans une OU ( Organisation Unit ) dédiée nommée « Shinken supervision users », placée à la racine du domaine par défaut. Pour la créer ailleurs, utilisez -OUPath (voir la référence des paramètres).
| Tip |
|---|
Sur une machine Active Directory, le redémarrage n'est pas nécessaire. Passez directement à la vérification. |
| Anchor |
|---|
| configuration_service_a_superviser |
|---|
| configuration_service_a_superviser |
|---|
|
Le check Service $KEY$ State by WinRM nécessite que l'utilisateur de supervision ait un accès en lecture au statut de chaque service à superviser.
Le strict minimum est déjà accordé par le script : scmanager, W32Time et WinRM, sans lesquels le pack ne fonctionne pas. Vous n'avez jamais à les indiquer.
Le reste est à votre appréciation : n'utilisez les paramètres ci-dessous que pour superviser vos propres services (applications métier, bases de données...).
| Paramètre | Description | Exemple |
|---|
-ServicesName <String[]> | Liste des noms de services à autoriser en lecture. Combinable avec -ServiceWhiteListPath. | .\Configure-Host.ps1 -ServicesName StorSvc,WSLService |
-ServiceWhiteListPath <String> | Chemin vers un fichier texte listant les services (un par ligne). Combinable avec -ServicesName. | .\Configure-Host.ps1 -ServiceWhiteListPath .\whitelist.txt |
-GrantAll | Accorde la lecture sur TOUS les services de la machine. Déconseillé en production — long et verbeux. | .\Configure-Host.ps1 -GrantAll |
-RevokeUnlisted | Révoque la lecture pour les services absents de la liste. Utile pour nettoyer une configuration précédente. | .\Configure-Host.ps1 -ServicesName W32Time -RevokeUnlisted |
-SkipServicePermissions | Se limite aux trois services critiques et ignore les 4 paramètres ci-dessus. Déjà actif par défaut : ne l'ajoutez que pour annuler des paramètres de services passés dans la même commande. | .\Configure-Host.ps1 -Interactive |
| Note |
|---|
Malgré son nom, -SkipServicePermissions ne désactive pas la configuration des services : il la limite aux trois services critiques, qui restent accordés dans tous les cas. |
Exemples de sortie :
| Panel |
|---|
Image Added
|
| Panel |
|---|
Image Added
|
| Panel |
|---|
Image Added
|
Gérer l'expiration du mot de passe
| Anchor |
|---|
| configuration-script-expired-password |
|---|
| configuration-script-expired-password |
|---|
|
Si le mot de passe du compte de supervision expire, la supervision s'arrête le jour même. Pour désactiver l'expiration dès la configuration initiale :
| Code Block |
|---|
|
.\Configure-Host.ps1 -Default -PasswordNeverExpires |
Ce commutateur fonctionne avec tous les modes :
| Code Block |
|---|
|
$secPass = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -PasswordNeverExpires |
| Info |
|---|
En mode -Interactive, la question vous est posée directement ; le commutateur n'est alors pas nécessaire. |
| Warning |
|---|
Si le mot de passe a déjà expiré, désactiver l'expiration ne suffit pas à débloquer le compte : il faut réinitialiser le mot de passe, puis désactiver l'expiration. |
Les nouvelles permissions ne s'appliquent qu'aux nouveaux jetons de connexion. Deux options :
- Attendre quelques minutes que les anciens jetons expirent, ou
- Redémarrer la machine (recommandé, plus fiable)
| Info |
|---|
Étape non nécessaire sur les machines Active Directory. |
Passez ensuite à la vérification.
Méthode B — Configuration manuelle, étape par étape
| Anchor |
|---|
| configuration_etape_par_etape |
|---|
| configuration_etape_par_etape |
|---|
|
| Info |
|---|
Cette méthode est l'équivalent exact de ce que fait le script. Suivez-la si vous préférez maîtriser chaque étape, ou si le script ne convient pas à votre environnement. Si vous avez utilisé la Méthode A, passez directement à la vérification. |
B.1 — Configuration minimale de WinRM
La commande intégrée winrm quickconfig effectue trois actions d'un coup :
- Démarre le service WinRM
- Crée l'écouteur HTTP (port 5985) qui reçoit les requêtes des sondes Shinken
- Ajoute la règle de pare-feu Windows autorisant l'accès à cet écouteur
| Code Block |
|---|
|
winrm quickconfig |
Exemple de sortie
| Code Block |
|---|
|
C:\Users\Administrateur> winrm quickconfig
WinRM n'est pas configuré pour la gestion à distance de cet ordinateur.
Les modifications suivantes doivent être effectuées :
Créez un écouteur WinRM sur HTTP://* pour accepter les demandes de la gestion
des services Web sur toutes les adresses IP de cet ordinateur.
Activez l'exception de pare-feu WinRM.
Configurez LocalAccountTokenFilterPolicy pour attribuer des droits
d'administration à distance à des utilisateurs locaux.
Effectuer ces modifications [y/n] ? y
WinRM a été mis à jour pour la gestion à distance. |
| Warning |
|---|
Windows 10 / 11 — piège fréquent : le réseau en profil « Public ». Si votre carte réseau est en profil Public (le défaut), la configuration du pare-feu échoue silencieusement: | Code Block |
|---|
| WSManFault
Message = L'exception de pare-feu WinRM ne fonctionnera pas car l'un des types
de connexion réseau de cet ordinateur est défini à Public. Changez le type de
connexion réseau en Domaine ou Privé, puis recommencez.
Numéro d'erreur : -2144108183 0x80338169 |
Solution : basculez la connexion en profil Privé ou Domaine, puis relancez winrm quickconfig. |
B.2 — Choisir le mode d'authentification
Par défaut, WinRM autorise Negotiate et désactive Basic.
| Mode | Sécurité | Commande |
|---|
| Negotiate (recommandé) | Protocole de négociation nécessaire pour communiquer via NTLM. | winrm set winrm/config/service/auth '@{Negotiate="true"}' |
| Basic (déconseillé) | Transmet les identifiants en clair. | winrm set winrm/config/service/auth '@{Basic="true"}' |
| Warning |
|---|
Si vous choisissez Basic, l'authentification n'apporte aucun chiffrement. Il faut donc autoriser explicitement les communications non chiffrées : | Code Block |
|---|
| winrm set winrm/config/service '@{AllowUnencrypted="true"}' |
N'utilisez Basic que si aucun mode plus sécurisé n'est disponible sur le système. HTTPS n'est pas supporté par le pack à ce jour. |
Plus de détails : Modèles d'hôtes du pack windows-by-WinRM__shinken
B.3 — Créer l'utilisateur de supervision
| Anchor |
|---|
| configuration_de_l_utilisateur |
|---|
| configuration_de_l_utilisateur |
|---|
|
Par interface graphique
| Anchor |
|---|
| creer_utilisateur_par_interface |
|---|
| creer_utilisateur_par_interface |
|---|
|
Ouvrez Gestion de l'ordinateur (compmgmt.msc) → Utilisateurs et groupes locaux → Utilisateurs → clic droit → Nouvel utilisateur…
| Panel |
|---|
Image Added
|
| Code Block |
|---|
|
& {
param(
[Parameter(Mandatory=$true)]
[string]$UserName,
[Parameter(Mandatory=$true)]
[string]$Password
)
net user $UserName $Password /ADD
} |
B.4 — Installer une langue
| Note |
|---|
À faire uniquement si Get-WinUserLanguageList (voir Prérequis) n'a retourné ni en-US ni fr-FR. |
Windows 10, Windows 11, Windows Server 2025
| Code Block |
|---|
|
# Installer l'anglais
Install-Language -Language en-US -ExcludeFeatures
# Installer le français
Install-Language -Language fr-FR -ExcludeFeatures |
| Note |
|---|
Cette opération peut prendre 5 à 30 minutes selon votre machine et la charge des serveurs Microsoft. |
Windows Server 2022, 2019, 2016 et 2012 R2
Ces versions ne disposent pas de Install-Language. Utilisez Features on Demand (FoD):
| Code Block |
|---|
|
DISM.exe /Online /add-capability /CapabilityName:Language.Basic~~~en-US~0.0.1.0 |
| Note |
|---|
Commande non disponible sur Windows Server 2012 R2. |
Pour une installation hors-ligne, demandez le pack de langue (.iso ou .cab) à votre support Microsoft, puis déployez-le avec DISM.exe.
Documentation Microsoft — Features on Demand
Par interface graphique
| Anchor |
|---|
| configuration_de_la_langue_par_interface |
|---|
| configuration_de_la_langue_par_interface |
|---|
|
Procédure pas à pas
Depuis le compte administrateur :
Étape 1 — Ouvrez les Paramètres Windows → catégorie Heure et Langue.
| Panel |
|---|
Image Added
|
Étape 2 — Allez dans la sous-catégorie Langue, puis cliquez sur Ajouter une langue.
| Panel |
|---|
Image Added
|
Étape 3 — Choisissez English (United-States) et installez la langue.
| Panel |
|---|
Image Added
|
| Panel |
|---|
Image Added
|
Étape 4 — La langue apparaît dans la liste. Cliquez dessus → Options, puis vérifiez que le module linguistique est bien installé.
| Panel |
|---|
Image Added
|
| Panel |
|---|
Image Added
|
B.5 — Appliquer la langue au compte de supervision
La langue doit être configurée pour l'utilisateur de supervision, pas seulement pour l'administrateur.
Par interface graphique
| Anchor |
|---|
| appliquer_langue_par_interface |
|---|
| appliquer_langue_par_interface |
|---|
|
Connectez-vous au compte de supervision, puis répétez les étapes ci-dessus. À l'installation, sélectionnez « Installer le module linguistique et définir comme ma langue d'affichage Windows ».
Vérifiez ensuite que la langue est :
- En première position de la liste des langues préférées
- Sélectionnée dans « Langue d'affichage de Windows »
| Panel |
|---|
Image Added
|
| Panel |
|---|
Image Added
|
Déconnectez-vous puis reconnectez-vous au compte de supervision pour appliquer le changement.
Cette méthode évite d'avoir à se connecter au compte : elle modifie directement la ruche de registre de l'utilisateur.
| Code Block |
|---|
|
& {
param(
[Parameter(Mandatory=$true)]
[string]$UserName,
[Parameter(Mandatory=$true)]
[string]$Password
)
$LangCode = "en-US", "fr-FR"
$Computer = $env:COMPUTERNAME
$SID = (Get-WmiObject Win32_UserAccount -Filter "Name='$UserName' AND Domain='$Computer'").SID
if (-not $SID) { throw "Impossible de récupérer le SID pour $UserName" }
# Récupération du profil
$UserProfile = Get-CimInstance Win32_UserProfile | Where-Object SID -eq $SID
# Le profil peut ne pas exister si l'utilisateur a été créé mais ne s'est jamais connecté.
# Tentative de connexion à l'utilisateur ...
if (-not $UserProfile) {
$SecurePassword = ConvertTo-SecureString $Password -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ($UserName, $SecurePassword)
try {
Start-Process -FilePath "whoami.exe" -Credential $Credential -WindowStyle Hidden -Wait
} catch {
Write-Host "Impossible de lancer un logon test pour $UserName ($_)" -ForegroundColor Red
}
# Récupération à nouveau du profil
$UserProfile = Get-CimInstance Win32_UserProfile | Where-Object SID -eq $SID
}
if (-not $UserProfile) { throw "Profil introuvable pour $UserName" }
$HivePath = Join-Path $UserProfile.LocalPath "NTUSER.DAT"
if (-not (Test-Path $HivePath)) { throw "Profil non initialisé (NTUSER.DAT introuvable) : $HivePath" }
$regRelative = "Control Panel\Desktop"
$valueName = "PreferredUILanguages"
$IsLoaded = Test-Path "Registry::HKEY_USERS\$SID"
if ($IsLoaded) {
$fullPath = "Registry::HKEY_USERS\$SID\$regRelative"
if (-not (Test-Path $fullPath)) { New-Item -Path $fullPath -Force | Out-Null }
if (-not (Get-ItemProperty -Path $fullPath -Name $valueName -ErrorAction SilentlyContinue)) {
New-ItemProperty -Path $fullPath -Name $valueName -Value $LangCode -PropertyType MultiString -Force | Out-Null
} else {
Set-ItemProperty -Path $fullPath -Name $valueName -Value $LangCode
}
} else {
Write-Host "Utilisateur non connecté. Chargement de la ruche..." -ForegroundColor Gray
reg load "HKU\TempHive" $HivePath | Out-Null
try {
$tempPath = "Registry::HKEY_USERS\TempHive\$regRelative"
if (-not (Test-Path $tempPath)) { New-Item -Path $tempPath -Force | Out-Null }
if (-not (Get-ItemProperty -Path $tempPath -Name $valueName -ErrorAction SilentlyContinue)) {
New-ItemProperty -Path $tempPath -Name $valueName -Value $LangCode -PropertyType MultiString -Force | Out-Null
} else {
Set-ItemProperty -Path $tempPath -Name $valueName -Value $LangCode
}
} finally {
reg unload "HKU\TempHive" | Out-Null
Write-Host "Ruche déchargée." -ForegroundColor Gray
}
}
Write-Host "Langue préférée utilisateur définie sur $LangCode (REG_MULTI_SZ)." -ForegroundColor Green
} |
B.6 — Ajouter l'utilisateur aux groupes
| Anchor |
|---|
| ajouter_utilisateur_aux_groupes |
|---|
| ajouter_utilisateur_aux_groupes |
|---|
|
L'utilisateur de supervision doit appartenir à trois groupes locaux:
- Utilisateurs de gestion à distance (Remote Management Users)
- Utilisateurs de l’Analyseur de performances (Performance Monitor Users)
- Lecteurs des journaux d’événements (Event Log Readers)
Par interface graphique
| Anchor |
|---|
| ajouter_groupes_par_interface |
|---|
| ajouter_groupes_par_interface |
|---|
|
Gestion de l'ordinateur (compmgmt.msc) → Utilisateurs et groupes locaux → Groupes → clic droit sur le groupe → Propriétés → Ajouter…
| Panel |
|---|
Image Added
|
Si l'interface Windows est en français :
| Code Block |
|---|
|
& {
param([Parameter(Mandatory=$true)][string]$UserName)
net localgroup "Utilisateurs de gestion à distance" $UserName /ADD
net localgroup "Utilisateurs de l’Analyseur de performances" $UserName /ADD
net localgroup "Lecteurs des journaux d’événements" $UserName /ADD
} |
Si l'interface Windows est en anglais :
| Code Block |
|---|
|
& {
param([Parameter(Mandatory=$true)][string]$UserName)
net localgroup "Remote Management Users" $UserName /ADD
net localgroup "Performance Monitor Users" $UserName /ADD
net localgroup "Event Log Readers" $UserName /ADD
} |
| Warning |
|---|
Piège du copier-coller — l'apostrophe typographique. Sur un Windows en français, ce groupe s'écrit avec une apostrophe typographique ’ ( U+2019 ), et non avec l'apostrophe droite ' ( U+0027 ) de la touche 4 du clavier. Retaper la commande à la main produit donc un nom que Windows ne reconnaît pas : | Code Block |
|---|
| L’erreur système 1376 s’est produite.
Le groupe local spécifié n’existe pas. |
Trois façons de s'en sortir : - Copiez-collez la commande ci-dessus : elle contient désormais la bonne apostrophe ;
- ou saisissez l'apostrophe avec ALT + 0146 au pavé numérique ( elle est différente de celle de la touche 4 ) ;
- ou utilisez le nom anglais du groupe, qui ne contient aucune apostrophe :
net localgroup "Performance Monitor Users" $UserName /ADD.
Pour lire le nom exact tel que Windows le stocke : | Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
| (Get-LocalGroup | Where-Object Name -like "*Analyseur*").Name |
| Panel |
|---|
Image Added
|
|
B.7 — Attribuer les permissions
Quatre jeux de permissions sont nécessaires.
L'utilisateur doit pouvoir lire et exécuter les commandes WinRM.
Par interface graphique :
| Code Block |
|---|
|
winrm configSDDL default |
Une fenêtre s'ouvre. Ajoutez l'utilisateur via Ajouter..., puis cochez dans le tableau des droits (après avoir sélectionné l'utilisateur) :
- Lecture (Get, Enumerate, Subscribe)
- Exécution (Invoke)
| Panel |
|---|
Image Added
|
Par ligne de commande
| Code Block |
|---|
|
& {
param(
[Parameter(Mandatory = $true)][string]$UserName
)
$GENERIC_READ = 0x80000000
$GENERIC_EXECUTE = 0x20000000
$user_sid = (New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $UserName).Translate([System.Security.Principal.SecurityIdentifier])
# Récupère le SDDL existant de l'écouteur WinRM
$sddl = (Get-Item -Path WSMan:\localhost\Service\RootSDDL).Value
# Convertit la chaîne SDDL en objet SecurityDescriptor
$sd = New-Object -TypeName System.Security.AccessControl.CommonSecurityDescriptor -ArgumentList $false, $false, $sddl
# Applique une nouvelle DACL à l'objet SecurityDescriptor
$sd.DiscretionaryAcl.AddAccess(
[System.Security.AccessControl.AccessControlType]::Allow,
$user_sid,
($GENERIC_READ -bor $GENERIC_EXECUTE),
[System.Security.AccessControl.InheritanceFlags]::None,
[System.Security.AccessControl.PropagationFlags]::None
)
# Récupère la chaîne SDDL depuis l'objet modifié
$new_sddl = $sd.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All)
# Applique le nouveau SDDL à l'écouteur WinRM
Set-Item -Path WSMan:\localhost\Service\RootSDDL -Value $new_sddl -Force
Write-Host "Permissions de 'Lecture' et 'Exécution' WinRM ajoutées pour l'utilisateur $UserName" -ForegroundColor Green
} |
b) Permissions sur les objets CIM (WMI)
La sonde interroge les informations système via les objets CIM. Deux espaces de noms sont concernés : root\cimv2 et root\standardcimv2.
| Info |
|---|
Cette section s'applique aussi aux machines en Active Directory. Le script Configure-Host.ps1 pose ces permissions dans tous les cas ( étapes 6 et 7 de son déroulé ) : en domaine, il les accorde au groupe de supervision au lieu du compte. Si vous suivez la méthode manuelle sur une machine du domaine, ne sautez donc pas cette étape. |
Par interface graphique :
Étape 1 — Lancez la console de contrôle WMI :
Étape 2 — Clic droit sur Contrôle WMI (local) → Propriétés.
| Panel |
|---|
Image Added
|
Étape 3 — Onglet Sécurité → dans l'arborescence, sélectionnez Root > CIMV2 → bouton Sécurité en bas à droite.
| Panel |
|---|
Image Added
|
| Panel |
|---|
Image Added
|
Étape 4 — Ajoutez l'utilisateur, puis cochez Activer le compte et Appel à distance autorisé.
| Panel |
|---|
Image Added
|
Étape 5 — Répétez l'opération pour StandardCimV2.
Par ligne de commande (traite les deux espaces de noms d'un coup)
| Code Block |
|---|
|
&{
Param (
[parameter(Mandatory=$true)][string] $username,
[bool] $allowInherit = $false,
[bool] $deny = $false,
[string] $computerName = ".",
[System.Management.Automation.PSCredential] $credential = $null
)
$namespaces = @("root\cimv2", "root\standardcimv2")
$permissions = @("Enable", "RemoteAccess")
foreach ($namespace in $namespaces) {
Write-Host "Configuration des permissions pour le namespace: $namespace"
$ErrorActionPreference = "Stop"
Function Get-AccessMaskFromPermission($permissions) {
$WBEM_ENABLE = 1
$WBEM_METHOD_EXECUTE = 2
$WBEM_FULL_WRITE_REP = 4
$WBEM_PARTIAL_WRITE_REP = 8
$WBEM_WRITE_PROVIDER = 0x10
$WBEM_REMOTE_ACCESS = 0x20
$READ_CONTROL = 0x20000
$WRITE_DAC = 0x40000
$WBEM_RIGHTS_FLAGS = $WBEM_ENABLE,$WBEM_METHOD_EXECUTE,$WBEM_FULL_WRITE_REP,`
$WBEM_PARTIAL_WRITE_REP,$WBEM_WRITE_PROVIDER,$WBEM_REMOTE_ACCESS,`
$READ_CONTROL,$WRITE_DAC
$WBEM_RIGHTS_STRINGS = "Enable","MethodExecute","FullWrite","PartialWrite",`
"ProviderWrite","RemoteAccess","ReadSecurity","WriteSecurity"
$permissionTable = @{}
for ($i = 0; $i -lt $WBEM_RIGHTS_FLAGS.Length; $i++) {
$permissionTable.Add($WBEM_RIGHTS_STRINGS[$i].ToLower(), $WBEM_RIGHTS_FLAGS[$i])
}
$accessMask = 0
foreach ($permission in $permissions) {
if (-not $permissionTable.ContainsKey($permission.ToLower())) {
throw "Unknown permission: $permission`nValid permissions: $($permissionTable.Keys)"
}
$accessMask += $permissionTable[$permission.ToLower()]
}
$accessMask
}
if ($PSBoundParameters.ContainsKey("Credential")) {
$remoteparams = @{ComputerName=$computerName;Credential=$credential}
} else {
$remoteparams = @{}
}
$invokeparams = @{Namespace=$namespace;Path="__systemsecurity=@"} + $remoteParams
$output = Invoke-WmiMethod @invokeparams -Name GetSecurityDescriptor
if ($output.ReturnValue -ne 0) {
throw "GetSecurityDescriptor failed: $($output.ReturnValue)"
}
$acl = $output.Descriptor
$OBJECT_INHERIT_ACE_FLAG = 0x1
$CONTAINER_INHERIT_ACE_FLAG = 0x2
$computerName = (Get-WmiObject @remoteparams Win32_ComputerSystem).Name
if ($username.Contains('\')) {
$domainaccount = $username.Split('\')
$domain = $domainaccount[0]
if (($domain -eq ".") -or ($domain -eq "BUILTIN")) {
$domain = $computerName
}
$accountname = $domainaccount[1]
} elseif ($username.Contains('@')) {
$domainaccount = $username.Split('@')
$domain = $domainaccount[1].Split('.')[0]
$accountname = $domainaccount[0]
} else {
$domain = $computerName
$accountname = $username
}
$getparams = @{Class="Win32_Account";Filter="Domain='$domain' and Name='$accountname'"} + $remoteParams
$win32account = Get-WmiObject @getparams
if ($win32account -eq $null) {
throw "Account was not found: $username"
}
$accessMask = Get-AccessMaskFromPermission($permissions)
$ace = (New-Object System.Management.ManagementClass("win32_Ace")).CreateInstance()
$ace.AccessMask = $accessMask
if ($allowInherit) {
$ace.AceFlags = $OBJECT_INHERIT_ACE_FLAG + $CONTAINER_INHERIT_ACE_FLAG
} else {
$ace.AceFlags = 0
}
$trustee = (New-Object System.Management.ManagementClass("win32_Trustee")).CreateInstance()
$trustee.SidString = $win32account.Sid
$ace.Trustee = $trustee
$ACCESS_ALLOWED_ACE_TYPE = 0x0
$ACCESS_DENIED_ACE_TYPE = 0x1
if ($deny) {
$ace.AceType = $ACCESS_DENIED_ACE_TYPE
} else {
$ace.AceType = $ACCESS_ALLOWED_ACE_TYPE
}
$acl.DACL += $ace.psobject.immediateBaseObject
$setparams = @{Name="SetSecurityDescriptor";ArgumentList=$acl.psobject.immediateBaseObject} + $invokeParams
$output = Invoke-WmiMethod @setparams
if ($output.ReturnValue -ne 0) {
throw "SetSecurityDescriptor failed: $($output.ReturnValue)"
}
Write-Host "Permissions configurées avec succès pour $username sur $namespace"
}
Write-Host "Configuration terminée pour tous les namespaces"
} |
c) Accès au service W32Time
Nécessaire pour récupérer les informations de temps (service NTP de Windows).
| Code Block |
|---|
|
&{
Param (
[parameter(Mandatory=$true)][string] $UserName
)
$sid = (New-Object System.Security.Principal.NTAccount($UserName)).Translate([System.Security.Principal.SecurityIdentifier]).Value
$currentSddl = & sc.exe sdshow w32time
# Ajoute les droits suivants à l'utilisateur
# CC – SERVICE_QUERY_CONFIG
# LC – SERVICE_QUERY_STATUS
# LO – SERVICE_INTERROGATE
$newAce = "(A;;CCLCLO;;;${sid})"
$newSddl = $currentSddl + $newAce
sc.exe sdset w32time "$newSddl"
Restart-Service w32time
} |
d) Accès au journal de sécurité
Nécessaire pour récupérer les tentatives de connexion échouées.
| Code Block |
|---|
|
&{
Param (
[parameter(Mandatory=$true)][string] $UserName
)
try {
$Path = "HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Security"
$acl = Get-Acl $Path
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
$UserName,
"ReadKey",
"Allow"
)
$acl.AddAccessRule($rule)
Set-Acl $Path $acl
Write-Host " Droits Registre appliqués." -ForegroundColor Green
} catch {
Write-Host " Erreur permissions EventLog Security: $_" -ForegroundColor Red
throw
}
} |
B.8 — Appliquer les permissions
| Anchor |
|---|
| appliquer_les_permissions |
|---|
| appliquer_les_permissions |
|---|
|
Les nouvelles permissions ne s'appliquent qu'aux nouveaux jetons de connexion. Deux options :
- Attendre quelques minutes que les anciens jetons expirent, ou
- Redémarrer la machine (recommandé)
Vérifier que tout fonctionne
| Anchor |
|---|
| tester_firewall_winrm |
|---|
| tester_firewall_winrm |
|---|
|
| Info |
|---|
Ces deux tests s'effectuent sur la machine Windows à superviser, dans un PowerShell administrateur. |
Test 1 — La règle de pare-feu
Objectif : vérifier que le pare-feu autorise bien les connexions WinRM (port 5985).
| Code Block |
|---|
|
Get-NetFirewallRule -Name "WINRM-HTTP-In-TCP" |
| Panel |
|---|
Image Added
|
Vérifiez que :
Enabled vaut TrueAction vaut Allow
Si ce n'est pas le cas, activez la règle :Les droits viennent d'être accordés au compte de supervision, mais les checks échouent toujours avec une erreur d'accès refusé. Les jetons de connexion déjà ouverts conservent les anciennes autorisations tant que les services ne sont pas relancés.
| Code Block |
|---|
|
UNKNOWN – Response fault error: Code: s:Sender, Subcode: w:AccessDenied |
Mots-clés : AccessDenied · Permission denied · accès refusé · winmgmt · WinRM · SDDL
Redémarrez les deux services concernés :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
Restart-Service winmgmt -Force
Restart-Service WinRM -Force |
| Info |
|---|
Si l'erreur persiste, patientez quelques minutes ou redémarrez la machine : certains jetons ne sont libérés qu'à l'expiration de leur cache. En Active Directory, laissez également le temps à la réplication de se propager entre contrôleurs de domaine. |
Le conteneur cible « CN=Users » est inaccessible – création d'OU impossible
Le script s'arrête au moment de créer l'unité d'organisation dédiée « Shinken supervision users ». Le paramètre -OUPath pointe vers CN=Users, qui est un conteneur et non une unité d'organisation : Active Directory interdit d'y créer une OU.
| Code Block |
|---|
|
Le conteneur cible 'CN=Users,DC=exemple,DC=local' est inaccessible |
Mots-clés : CN=Users · -OUPath · conteneur cible inaccessible · OU · unité d'organisation · Shinken supervision users
| Panel |
|---|
Image Removed
|
Visez une véritable unité d'organisation :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
.\Configure-Host.ps1 -Default -Domain -OUPath "OU=Utilisateurs,DC=exemple,DC=local" |
| Info |
|---|
Sans -OUPath, l'OU dédiée est créée à la racine du domaine : c'est le comportement par défaut, et il fonctionne dans la majorité des cas. |
Aucun identifiant de domaine utilisable – échec en mode non interactif
Lancé à distance ou par tâche planifiée sur une machine du domaine, le script s'arrête avant toute modification. Il ne dispose pas d'identifiants pour écrire dans l'annuaire et ne peut pas les demander : une invite bloquerait l'exécution automatisée.
| Code Block |
|---|
|
Aucun identifiant de domaine utilisable.
Fournissez-en un de l'une de ces façons :
- paramètre -DomainCredential (recommandé pour un déclenchement distant) ;
- exécution sous un compte de domaine habilité (tâche planifiée) ;
- mode -Interactive, qui demandera les identifiants. |
Mots-clés : -DomainCredential · identifiant de domaine · annuaire · Invoke-Command · tâche planifiée · non interactif
Fournissez explicitement des identifiants habilités à écrire dans l'annuaire :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
$cred = Get-Credential
.\Configure-Host.ps1 -Default -Domain -DomainCredential $cred |
| Info |
|---|
En mode -Interactive, ou lorsque la session courante dispose déjà des droits d'écriture dans l'annuaire, -DomainCredential est inutile. |
Le check Service $KEY$ State by WinRM remonte une erreur
Les autres checks de la machine fonctionnent, mais la supervision d'un service précis échoue. Le compte de supervision n'a pas l'accès en lecture au service demandé : seuls scmanager, W32Time et WinRM sont autorisés par défaut.
| Code Block |
|---|
|
UNKNOWN – Command execution Failed. Permission denied. |
Mots-clés : Service $KEY$ State · Permission denied · -ServicesName · sc.exe sdshow · scmanager
| Panel |
|---|
Image Removed
|
Relancez le script en indiquant le ou les services à autoriser :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -ServicesName "MonService","AutreService" |
Pour vérifier les droits posés sur un service :
| Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
|
sc.exe sdshow MonService |
| Info |
|---|
Le nom à fournir est le nom court du service (colonne Name), pas son nom d'affichage. Pour le retrouver : | Code Block |
|---|
| language | powershell |
|---|
| theme | Emacs |
|---|
| Get-Service | Where-Object DisplayName -like "*MonApplication*" |
|
Votre essai Premium est terminéVotre essai Premium est terminé
...
Enable-NetFirewallRule -Name "WINRM-HTTP-In-TCP" |
Test 2 — La connexion WinRM
Objectif : réaliser une connexion WinRM en local avec le compte de supervision.
Utilisez la commande correspondant au mode d'authentification que vous avez configuré :
| Code Block |
|---|
|
# Si vous avez configuré Negotiate (recommandé)
Test-WSMan localhost -Credential (Get-Credential) -Authentication Negotiate |
| Code Block |
|---|
|
# Si vous avez configuré Basic
Test-WSMan localhost -Credential (Get-Credential) -Authentication Basic |
Saisissez le nom d'utilisateur et le mot de passe du compte de supervision:
| Panel |
|---|
Image Added
|
Résultat attendu :
| Panel |
|---|
Image Added
|
Ce retour confirme que le service WinRM et le compte de supervision sont opérationnels sur la machine.
Référence complète des paramètres du script
| Paramètre | Type | Description |
|---|
-Default | switch | Configuration automatique avec les valeurs par défaut |
-Interactive | switch | Assistant pas-à-pas avec explications contextuelles |
-Help | switch | Affiche l'aide complète |
-Version | switch | Affiche la version du script |
Compte et authentification
| Paramètre | Type | Description |
|---|
-UserName | string | Nom du compte local à créer (ex. shinken_user) |
-Password | SecureString ou string | Mot de passe du compte |
-Negotiate | true / false | Active l'authentification Negotiate — recommandé |
-Basic | true / false | Active l'authentification Basic — nécessite AllowUnencrypted=true |
-AllowUnencrypted | true / false | Autorise les connexions non chiffrées — obligatoire avec Basic |
-PasswordNeverExpires | switch | Le mot de passe du compte n'expire jamais |
| Paramètre | Type | Description |
|---|
-Domain | switch | Force le mode Active Directory (échoue si la machine n'est pas membre d'un domaine) |
-Local | switch | Force le mode workgroup (compte local) même sur une machine du domaine |
| Info |
|---|
Sans -Domain ni -Local, le mode est détecté automatiquement. |
| Paramètre | Type | Description |
|---|
-ADUserName | string | sAMAccountName du compte de supervision AD |
-ADGroupName | string | Groupe global de sécurité AD portant les permissions |
-CreateADUser | switch | Crée le compte AD au lieu d'exiger qu'il existe déjà |
-CreateADGroup | switch | Crée le groupe AD au lieu d'exiger qu'il existe déjà |
-DomainCredential | PSCredential | Identifiants d'écriture dans l'annuaire. Facultatif : utile surtout en lancement automatisé |
-OUPath | string | OU parent de création (DN). Par défaut : racine du domaine. Ne peut pas pointer vers CN=Users |
| Paramètre | Type | Description |
|---|
-ServicesName | string[] | Liste des services à autoriser en lecture |
-ServiceWhiteListPath | string | Fichier texte listant les services (un par ligne) |
-GrantAll | switch | Autorise tous les services — déconseillé en production |
-RevokeUnlisted | switch | Révoque les droits sur les services non listés |
-SkipServicePermissions | switch | Limite les droits aux 3 services critiques (scmanager, W32Time, WinRM). Comportement par défaut |