Contexte

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 le pack windows-by-WinRM__shinken.




Pour qui ?Administrateur Windows, du débutant au confirmé
Durée1 à 10 minutes avec le script, ~45 minutes en manuel
Ce dont vous avez besoinUn 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é

Périmètre de ce guide

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


Pour superviser un parc important, ou si vous avez besoin de maîtriser finement la configuration appliquée et déployée, consultez la page Configuration centralisée par GPO d'un parc Windows (Active Directory) pour le pack windows-by-WinRM__shinken

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

La supervision d'un Windows par un poller Shinken repose sur des requêtes WinRM :

  1. Côté poller Shinken — la sonde WinRM envoie les requêtes et traite les réponses.
  2. Côté Windows supervisé — le service WinRM reçoit les requêtes et y répond.
  3. 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


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

Vérifiez ces trois points avant de commencer.

1. Version de Windows supportée

Le Windows supervisé doit correspondre à une des versions suivantes :


Postes de travailServeurs
Windows 11Windows Server 2025
Windows 10Windows 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)

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 :

Get-WinUserLanguageList

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 :

LanguageTag     : en-US
Autonym         : English (United States)
EnglishName     : English
LocalizedName   : English (United States)
ScriptName      : Latin
InputMethodTips : {0409:0001040C}
Spellchecking   : True
Handwriting     : False

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 :

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 FeaturesBasicTyping, 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.

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 :

Get-Service WinRM
Status   Name    DisplayName
------   ----    -----------
Running  WinRM   Gestion à distance de Windows (Gest...

Windows 10 et Windows 11 uniquement — le service n'est pas en démarrage automatique par défaut. Corrigez-le :

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 vigilanceDétail
Modifications systèmeLe script modifie WinRM, WMI, les services et les permissions.
Testez d'abordValidez sur une machine de test ou un serveur non critique avant la production.
Droits administrateurObligatoires. 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.

Détail des opérations

  1. Vérifie qu'une langue compatible (anglais ou français) est installée.
  2. Crée l'utilisateur de supervision et l'ajoute aux groupes nécessaires (Remote Management Users, Performance Monitor Users, Event Log Readers).
  3. Configure la langue de cet utilisateur.
  4. Configure WinRM : authentification Negotiate ou Basic puis l'écouteur HTTP.
  5. Autorise l'utilisateur à exécuter des commandes WinRM.
  6. Donne l'accès WMI/CIM à root\cimv2.
  7. Donne l'accès WMI/CIM à root\standardcimv2.
  8. Donne l'accès en lecture au journal de sécurité (Security Event Log).
  9. Donne l'accès au service W32Time (service NTP de Windows).
  10. Donne l'accès en lecture au statut d'une liste configurable de services.
  11. 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

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 :

scp supervised-host/Configure-Host.ps1 Administrateur@<IP_HOST>:C:/Users/Administrateur/

Étape 3 — Autoriser l'exécution du 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 :

Solution — lever la restriction pour la session en cours uniquement :

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

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 :

ModeCommandeQuand l'utiliser
Par défaut.\Configure-Host.ps1 -DefaultPour tester rapidement le pack
Assistant.\Configure-Host.ps1 -InteractivePour une configuration guidée
Paramétré.\Configure-Host.ps1 -UserName ... -Password ...Pour un déploiement automatisé
Aide.\Configure-Host.ps1 -HelpPour afficher l'aide complète
Version.\Configure-Host.ps1 -VersionPour connaître la version du script

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.

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.

Mot de passe : le script accepte un SecureString (recommandé) ou une simple chaîne de caractères. Pour préparer un SecureString :

$secPass = ConvertTo-SecureString "VotreMotDePasse" -AsPlainText -Force

Mode par défaut

Variantes possibles :

CommandeCe qu'elle fait
.\Configure-Host.ps1 -DefaultMode domaine ou workgroup détecté automatiquement selon l'appartenance de la machine.
.\Configure-Host.ps1 -Default -LocalForce la création d'un compte local, même sur une machine jointe à un domaine.
.\Configure-Host.ps1 -Default -DomainForce 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 $credIdem, avec des identifiants d'annuaire explicites (lancement à distance, tâche planifiée).
.\Configure-Host.ps1 -Default

Valeurs appliquées :

ParamètreValeur par défaut
UserNameshinken_user
PasswordCh4nge_Th1s_P4ssw0rd
Negotiatetrue
Basicfalse
AllowUnencryptedfalse

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é.

-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 :

CommandeCe qu'elle fait
.\Configure-Host.ps1 -InteractiveAssistant complet. Le mode domaine ou workgroup est détecté automatiquement.
.\Configure-Host.ps1 -Interactive -LocalAssistant, en forçant la création d'un compte local.
.\Configure-Host.ps1 -Interactive -DomainAssistant, 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 $credIdem, en fournissant les identifiants d'annuaire à l'avance plutôt qu'à l'invite.
.\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 :

Exemple sur une machine Active Directory :

Mode paramétré (ligne de commande)

Variantes possibles :

CommandeCe qu'elle fait
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPassCompte local. L'authentification est demandée si elle n'est pas précisée.
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -Negotiate trueCompte local, authentification Negotiate (recommandée).
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -Basic true -AllowUnencrypted trueCompte local, authentification Basic. À réserver aux cas où Negotiate est impossible.
.\Configure-Host.ps1 -ADUserName "shinken_user" -ADGroupName "GRP_SHINKEN" -Password $secPassActive Directory : utilise un compte et un groupe déjà existants.
.\Configure-Host.ps1 -ADUserName "shinken_user" -CreateADUser -ADGroupName "GRP_SHINKEN" -CreateADGroup -Password $secPassActive 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 -GrantAllAutorise la lecture sur tous les services. Déconseillé en production.

Machine en Workgroup :

$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 :

$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à :

.\Configure-Host.ps1 -ADUserName "shinken_user" -ADGroupName "GRP_SHINKEN"

Spécificités Active Directory

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.


WorkgroupActive Directory
Ce qui est crééUn compte localUn compte et un groupe de domaine
Qui porte les permissionsLe compteLe groupe
Paramètres à fournir-UserName-ADUserName et -ADGroupName

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).

Sur une machine Active Directory, le redémarrage n'est pas nécessaire. Passez directement à la vérification.

Configurer les services à 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ètreDescriptionExemple
-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
-GrantAllAccorde la lecture sur TOUS les services de la machine. Déconseillé en production — long et verbeux..\Configure-Host.ps1 -GrantAll
-RevokeUnlistedRévoque la lecture pour les services absents de la liste. Utile pour nettoyer une configuration précédente..\Configure-Host.ps1 -ServicesName W32Time -RevokeUnlisted
-SkipServicePermissionsSe 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

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 :

Gérer l'expiration du mot de passe

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 :

.\Configure-Host.ps1 -Default -PasswordNeverExpires

Ce commutateur fonctionne avec tous les modes :

$secPass = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
.\Configure-Host.ps1 -UserName "shinken_user" -Password $secPass -PasswordNeverExpires

En mode -Interactive, la question vous est posée directement ; le commutateur n'est alors pas nécessaire.

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.

Étape 5 — Redémarrer

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)

Étape non nécessaire sur les machines Active Directory.

Passez ensuite à la vérification.

Méthode B — Configuration manuelle, étape par étape

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
winrm quickconfig

Exemple de sortie

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.

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:

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.

ModeSé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"}'

Si vous choisissez Basic, l'authentification n'apporte aucun chiffrement. Il faut donc autoriser explicitement les communications non chiffrées :

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

Par interface graphique

Ouvrez Gestion de l'ordinateur (compmgmt.msc) → Utilisateurs et groupes locauxUtilisateurs → clic droit → Nouvel utilisateur…

Par ligne de commande

& {
param(
   [Parameter(Mandatory=$true)]
   [string]$UserName,

   [Parameter(Mandatory=$true)]
   [string]$Password
)
net user $UserName $Password /ADD
}

B.4 — Installer une langue

À faire uniquement si Get-WinUserLanguageList (voir Prérequis) n'a retourné ni en-US ni fr-FR.

Windows 10, Windows 11, Windows Server 2025

# Installer l'anglais
Install-Language -Language en-US -ExcludeFeatures

# Installer le français
Install-Language -Language fr-FR -ExcludeFeatures

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):

DISM.exe /Online /add-capability /CapabilityName:Language.Basic~~~en-US~0.0.1.0

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

Procédure pas à pas

Depuis le compte administrateur :

Étape 1 — Ouvrez les Paramètres Windows → catégorie Heure et Langue.

Étape 2 — Allez dans la sous-catégorie Langue, puis cliquez sur Ajouter une langue.

Étape 3 — Choisissez English (United-States) et installez la langue.

Étape 4 — La langue apparaît dans la liste. Cliquez dessus → Options, puis vérifiez que le module linguistique est bien installé.

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

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 »

Déconnectez-vous puis reconnectez-vous au compte de supervision pour appliquer le changement.

Par ligne de commande

Cette méthode évite d'avoir à se connecter au compte : elle modifie directement la ruche de registre de l'utilisateur.

& {

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

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

Gestion de l'ordinateur (compmgmt.msc) → Utilisateurs et groupes locauxGroupes → clic droit sur le groupe → PropriétésAjouter…

Par ligne de commande

Si l'interface Windows est en français :

& {
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 :

& {
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
}

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 :

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 :

(Get-LocalGroup | Where-Object Name -like "*Analyseur*").Name

B.7 — Attribuer les permissions

Quatre jeux de permissions sont nécessaires.

a) Permissions WinRM

L'utilisateur doit pouvoir lire et exécuter les commandes WinRM.

Par interface graphique :

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)

Par ligne de commande

& {

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.

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 :

wmimgmt.msc

Étape 2 — Clic droit sur Contrôle WMI (local)Propriétés.

Étape 3 — Onglet Sécurité → dans l'arborescence, sélectionnez Root > CIMV2 → bouton Sécurité en bas à droite.

Étape 4 — Ajoutez l'utilisateur, puis cochez Activer le compte et Appel à distance autorisé.

Étape 5Répétez l'opération pour StandardCimV2.

Par ligne de commande (traite les deux espaces de noms d'un coup)

&{

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).

&{

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.

&{

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

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

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).

Get-NetFirewallRule -Name "WINRM-HTTP-In-TCP"

Vérifiez que :

  • Enabled vaut True
  • Action vaut Allow

Si ce n'est pas le cas, activez la règle :

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é :

# Si vous avez configuré Negotiate (recommandé)
Test-WSMan localhost -Credential (Get-Credential) -Authentication Negotiate
# 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:

Résultat attendu :

Ce retour confirme que le service WinRM et le compte de supervision sont opérationnels sur la machine.

Dépannage

Les erreurs rencontrées pendant la configuration — refus d'exécution du script, service WinRM arrêté, mot de passe expiré, création d'OU impossible... — sont détaillées avec leur résolution sur la page Erreurs de configuration d'un Windows supervisé pour le pack windows-by-WinRM__shinken.

Pour les erreurs remontées par les checks une fois la supervision en place, consultez la page Erreurs du pack windows-by-WinRM__shinken.

Référence complète des paramètres du script

Modes d'exécution

ParamètreTypeDescription
-DefaultswitchConfiguration automatique avec les valeurs par défaut
-InteractiveswitchAssistant pas-à-pas avec explications contextuelles
-HelpswitchAffiche l'aide complète
-VersionswitchAffiche la version du script

Compte et authentification

ParamètreTypeDescription
-UserNamestringNom du compte local à créer (ex. shinken_user)
-PasswordSecureString ou stringMot de passe du compte
-Negotiatetrue / falseActive l'authentification Negotiate — recommandé
-Basictrue / falseActive l'authentification Basic — nécessite AllowUnencrypted=true
-AllowUnencryptedtrue / falseAutorise les connexions non chiffrées — obligatoire avec Basic
-PasswordNeverExpiresswitchLe mot de passe du compte n'expire jamais

Mode de fonctionnement

ParamètreTypeDescription
-DomainswitchForce le mode Active Directory (échoue si la machine n'est pas membre d'un domaine)
-LocalswitchForce le mode workgroup (compte local) même sur une machine du domaine

Sans -Domain ni -Local, le mode est détecté automatiquement.

Active Directory

ParamètreTypeDescription
-ADUserNamestringsAMAccountName du compte de supervision AD
-ADGroupNamestringGroupe global de sécurité AD portant les permissions
-CreateADUserswitchCrée le compte AD au lieu d'exiger qu'il existe déjà
-CreateADGroupswitchCrée le groupe AD au lieu d'exiger qu'il existe déjà
-DomainCredentialPSCredentialIdentifiants d'écriture dans l'annuaire. Facultatif : utile surtout en lancement automatisé
-OUPathstringOU parent de création (DN). Par défaut : racine du domaine. Ne peut pas pointer vers CN=Users

Services supervisés

ParamètreTypeDescription
-ServicesNamestring[]Liste des services à autoriser en lecture
-ServiceWhiteListPathstringFichier texte listant les services (un par ligne)
-GrantAllswitchAutorise tous les services — déconseillé en production
-RevokeUnlistedswitchRévoque les droits sur les services non listés
-SkipServicePermissionsswitchLimite les droits aux 3 services critiques (scmanager, W32Time, WinRM). Comportement par défaut

Et après ?

La configuration de la machine Windows est terminée : elle est prête à être supervisée.

Étape suivante : choisir, accrocher et paramétrer les modèles d'hôtes fournis dans le pack.

Modèles d'hôtes du pack windows-by-WinRM__shinken

Pages liées