Pack concerné : Versions : V02.08.00 — script |
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é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 |
|
Ce guide couvre la configuration machine par machine. Il vous permet de :
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 :
|
La supervision d'un Windows par un poller Shinken repose sur des requêtes WinRM :
Il faut donc configurer deux choses sur chaque machine supervisée :
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. |
Vérifiez ces trois points avant de commencer.
Le Windows supervisé doit correspondre à une des versions suivantes :
|
PowerShell 4.0 ou supérieur est également requis.
La sonde interprète les réponses de Windows : au moins une de ces deux langues doit être installée sur la machine.
fr-FR)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
Elle n'existe pas sur Windows Server 2022, 2019, 2016 et 2012 R2 : utilisez Seul le code de langue compte ( |
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.
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 :
|
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.
| 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. |
root\cimv2.root\standardcimv2.W32Time (service NTP de Windows).winmgmt et WinRM pour appliquer les modifications.Le script est livré dans le pack, sous le répertoire supervised-host/.
Vous pouvez aussi le télécharger ici : Configure-Host.ps1
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/ |
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.
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 |
Le mode domaine est détecté automatiquement : inutile de préciser
|
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 |
Mot de passe : le script accepte un
|
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). |
.\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 |
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é. |
|
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. |
.\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 :
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 :
$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" |
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 |
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. |
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 |
Malgré son nom, |
Exemples de sortie :
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 |
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 :
Étape non nécessaire sur les machines Active Directory. |
Passez ensuite à la vérification.
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. |
La commande intégrée winrm quickconfig effectue trois actions d'un coup :
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:
Solution : basculez la connexion en profil Privé ou Domaine, puis relancez |
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"}' |
Si vous choisissez Basic, l'authentification n'apporte aucun chiffrement. Il faut donc autoriser explicitement les communications non chiffrées :
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
Ouvrez Gestion de l'ordinateur (compmgmt.msc) → Utilisateurs et groupes locaux → Utilisateurs → clic droit → Nouvel utilisateur…
& {
param(
[Parameter(Mandatory=$true)]
[string]$UserName,
[Parameter(Mandatory=$true)]
[string]$Password
)
net user $UserName $Password /ADD
} |
À faire uniquement si |
# 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. |
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.
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é.
La langue doit être configurée pour l'utilisateur de supervision, pas seulement pour l'administrateur.
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 :
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.
& {
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
} |
L'utilisateur de supervision doit appartenir à trois groupes locaux:
Gestion de l'ordinateur (compmgmt.msc) → Utilisateurs et groupes locaux → Groupes → clic droit sur le groupe → Propriétés → Ajouter…
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
Trois façons de s'en sortir :
Pour lire le nom exact tel que Windows le stocke :
|
Quatre jeux de permissions sont nécessaires.
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) :
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
} |
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 |
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 5 — Ré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"
} |
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
} |
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
}
} |
Les nouvelles permissions ne s'appliquent qu'aux nouveaux jetons de connexion. Deux options :
Ces deux tests s'effectuent sur la machine Windows à superviser, dans un PowerShell administrateur. |
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 TrueAction vaut AllowSi ce n'est pas le cas, activez la règle :
Enable-NetFirewallRule -Name "WINRM-HTTP-In-TCP" |
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.
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. |
| 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 |
| 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 |
Sans |
| 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 |
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.