Vous devez arrêter WINS et repérer rapidement où il est encore configuré ? Voici une méthode fiable et industrialisable pour auditer des centaines de Windows Server 2012/2016 et produire un inventaire exploitable.
Vue d’ensemble de la question
Objectif : recenser, à l’échelle d’un parc Windows Server 2012/2016 (y compris Server Core), les machines qui possèdent encore des serveurs WINS déclarés dans l’onglet WINS des cartes réseau. Ce recensement sert à préparer un plan de décommissionnement : suppression des adresses WINS héritées, contrôle de conformité, puis extinction progressive des services WINS éventuellement restants.
Réponse & solutions
Approche | Principe | Extrait / commande clé | Points forts | Limites |
---|---|---|---|---|
Inspection manuelle | Exécuter ipconfig /all sur chaque serveur ; la section « Serveurs WINS » apparaît si au moins une adresse est configurée. | ipconfig /all | Immédiat, aucun script requis. | Impossible à l’échelle, pas d’export centralisé. |
Script PowerShell (WMI/CIM) | Interroger à distance les adaptateurs réseau via WMI/CIM pour lire les attributs WINSPrimaryServer et WINSSecondaryServer et exporter en CSV. | Get-CimInstance Win32_NetworkAdapterConfiguration | Automatisé, rapide, exportable dans Excel / Power BI, compatible Server 2012+ | Nécessite droits d’admin + ouverture WinRM (5985/5986) ou DCOM. |
GPO + Compliance (SCCM/Intune) | Déployer un Configuration/Compliance Item qui interroge les mêmes propriétés WMI et remonte l’état dans la console. | Script de détection PowerShell (voir plus bas) | Inventaire continu, tableaux de bord intégrés, pérenne. | Complexité de mise en place si la plateforme n’est pas déjà en place. |
Méthode recommandée : audit PowerShell pas à pas
Pré-requis techniques
- Compte avec droits d’administration locaux sur les serveurs à auditer.
- Accès réseau aux cibles : WinRM (TCP 5985/5986) ou DCOM (TCP 135 + plage RPC dynamique). Pour simplifier, privilégiez WinRM.
- Poste d’orchestration avec PowerShell 5.1 (ou supérieur) et connectivité vers les serveurs.
- Fichier texte
ListeServeurs.txt
contenant un nom NetBIOS, FQDN ou IP par ligne (commentaires autorisés avec#
).
Pourquoi WMI/CIM ?
La classe Win32_NetworkAdapterConfiguration
expose, par interface réseau, les attributs WINSPrimaryServer
et WINSSecondaryServer
ainsi que l’état NetBIOS sur TCP/IP (TcpipNetbiosOptions
). En filtrant IPEnabled = True
, on évite les boucles locales et adaptateurs virtuels inactifs.
Le script complet prêt à l’emploi
Copiez le script ci-dessous dans un fichier, par exemple Audit-WINS.ps1
. Il gère WinRM avec repli automatique sur DCOM, exporte un CSV principal et un CSV des erreurs de session, et affiche un résumé de fin d’exécution.
#requires -version 5.1
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$ServerListPath,
[string]$OutCsv = ".\Inventaire_WINS.csv",
[switch]$PreferDCOM
)
Write-Verbose "Lecture de la liste serveurs…"
$servers = Get-Content -Path $ServerListPath |
Where-Object { $_ -and $_ -notmatch '^\s*#' } |
ForEach-Object { $_.Trim() } |
Where-Object { $_ } |
Sort-Object -Unique
if (-not $servers) { throw "La liste de serveurs est vide." }
# Prépare les options DCOM si demandé ou en repli
$sessionOptionPrefer = if ($PreferDCOM) { New-CimSessionOption -Protocol Dcom } else { $null }
$sessionOptionDcom = New-CimSessionOption -Protocol Dcom
$okSessions = New-Object System.Collections.Generic.List[Microsoft.Management.Infrastructure.CimSession]
$badSessions = New-Object System.Collections.Generic.List[psobject]
Write-Verbose "Création des sessions CIM…"
foreach ($s in $servers) {
try {
$cs = if ($sessionOptionPrefer) {
New-CimSession -ComputerName $s -SessionOption $sessionOptionPrefer -ErrorAction Stop
} else {
try { New-CimSession -ComputerName $s -ErrorAction Stop } # WSMan (WinRM)
catch { New-CimSession -ComputerName $s -SessionOption $sessionOptionDcom -ErrorAction Stop } # Repli DCOM
}
$null = $okSessions.Add($cs)
} catch {
$null = $badSessions.Add([pscustomobject]@{ Computer=$s; Error=$_.Exception.Message })
}
}
$results = @()
if ($okSessions.Count -gt 0) {
Write-Verbose "Interrogation WMI/CIM des cartes réseau actives…"
$adapters = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration -CimSession $okSessions |
Where-Object { $_.IPEnabled -eq $true }
foreach ($a in $adapters) {
# IP v4 lisible
$ip4 = @($a.IPAddress | Where-Object { $_ -match '^\d{1,3}(\.\d{1,3}){3}$' }) -join ','
$nb = switch ($a.TcpipNetbiosOptions) { 0{'Par défaut'} 1{'Activé'} 2{'Désactivé'} default{'Inconnu'} }
$results += [pscustomobject]@{
Serveur = $a.PSComputerName
Carte = $a.Description
MAC = $a.MACAddress
AdresseIP = $ip4
PrimaryWINS = $a.WINSPrimaryServer
SecondaryWINS = $a.WINSSecondaryServer
NetBIOS = $nb
}
}
}
# Exports
$results | Sort-Object Serveur, Carte |
Export-Csv -Path $OutCsv -NoTypeInformation -Encoding UTF8
if ($badSessions.Count -gt 0) {
$badSessions | Export-Csv -Path ($OutCsv -replace '\.csv$', '_erreurs.csv') -NoTypeInformation -Encoding UTF8
}
# Résumé
$withWins = $results | Where-Object { $_.PrimaryWINS -or $_.SecondaryWINS }
Write-Host ("-" * 64)
Write-Host ("Serveurs listés : {0}" -f $servers.Count)
Write-Host ("Sessions établies : {0}" -f $okSessions.Count)
Write-Host ("Sessions en échec : {0}" -f $badSessions.Count)
Write-Host ("Interfaces avec WINS : {0}" -f $withWins.Count)
Write-Host ("CSV principal : {0}" -f $OutCsv)
if ($badSessions.Count -gt 0) {
Write-Host ("CSV des erreurs : {0}" -f ($OutCsv -replace '\.csv$', '_erreurs.csv'))
}
Exécution type :
.\Audit-WINS.ps1 -ServerListPath .\ListeServeurs.txt -OutCsv .\Inventaire_WINS.csv
Filtrer immédiatement les exceptions
Après l’audit, isolez les serveurs qui affichent au moins une adresse WINS dans l’une de leurs interfaces :
Import-Csv .\Inventaire_WINS.csv |
Where-Object { $_.PrimaryWINS -or $_.SecondaryWINS } |
Export-Csv .\Inventaire_WINS_avec_WINS.csv -NoTypeInformation -Encoding UTF8
Vous pouvez aussi visualiser le volume par serveur :
Import-Csv .\Inventaire_WINS.csv |
Where-Object { $_.PrimaryWINS -or $_.SecondaryWINS } |
Group-Object Serveur |
Sort-Object Count -Descending |
Format-Table Name, Count
Validation ponctuelle sur un serveur
Pour vérifier « à la main » ou lors d’un dépannage :
ipconfig /all
netsh interface ip show wins
ou encore en PowerShell :
Get-CimInstance Win32_NetworkAdapterConfiguration -ComputerName SRV01 |
Where-Object IPEnabled |
Select-Object Description, WINSPrimaryServer, WINSSecondaryServer, TcpipNetbiosOptions
Bonnes pratiques d’exécution à grande échelle
Alimentation automatique de la liste des serveurs depuis Active Directory
Si vous disposez des outils d’administration AD, générez à la volée votre liste :
Import-Module ActiveDirectory
Get-ADComputer -Filter "OperatingSystem -like 'Windows Server*' -and Enabled -eq 'TRUE'" |
Select-Object -ExpandProperty Name |
Sort-Object -Unique |
Out-File .\ListeServeurs.txt -Encoding ascii
Optimiser la performance
- Sessions CIM groupées : le script crée des CimSession puis interroge tous les serveurs en un seul appel, ce qui parallélise efficacement sans jobs.
- Filtrage local (
IPEnabled = True
) : moins de données renvoyées, résultats plus propres. - IPv4 vs IPv6 : l’exemple concatène les IPv4 pour faciliter les croisements avec des CMDB qui n’intègrent pas toujours l’IPv6.
Gestion des échecs de connexion
Les erreurs typiques et leurs remèdes :
Message | Cause probable | Correctif rapide |
---|---|---|
The RPC server is unavailable | Ports DCOM/RPC filtrés si repli DCOM | Ouvrir TCP 135 + plage RPC ou forcer WinRM côté serveur |
WSManFault / Access is denied | Compte non autorisé à distance | Utiliser un compte admin local/domaine, vérifier la stratégie WinRM |
The WinRM client cannot process the request | WinRM non configuré | Enable-PSRemoting -Force ou GPO « Allow remote management via WinRM » |
NetBIOS sur TCP/IP : quoi surveiller ?
L’état NetBIOS n’est pas synonyme de WINS, mais souvent corrélé dans les environnements historiques. La propriété TcpipNetbiosOptions
prend les valeurs suivantes :
Valeur | Interprétation |
---|---|
0 | Par défaut (hérité DHCP ou configuration globale) |
1 | Activé explicitement |
2 | Désactivé explicitement |
Inclure cet indicateur dans votre export permet d’identifier les serveurs où NetBIOS/TCP est encore actif, même si WINS n’est plus configuré, afin de finaliser la modernisation (désactivation NetBIOS si possible).
Exemples d’exploitation du CSV
Top des serveurs à traiter
Import-Csv .\Inventaire_WINS.csv |
Where-Object { $_.PrimaryWINS -or $_.SecondaryWINS } |
Group-Object Serveur |
Sort-Object Count -Descending |
Select-Object -First 20 |
Format-Table Name, Count
Préparer un plan de remédiation
Produisez un lot par équipe ou par zone réseau, puis planifiez le retrait des adresses WINS sur une fenêtre de maintenance. Si vous souhaitez automatiser la suppression, travaillez par petites vagues et vérifiez après chaque lot que les applications historiques ne dépendent plus de WINS.
Approche SCCM/Intune : détection de conformité
Cette approche complète l’audit initial par un contrôle continu.
Script de détection (SCCM CI / Intune Proactive Remediations)
$adapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled = True"
$withWins = $adapters | Where-Object { $_.WINSPrimaryServer -or $_.WINSSecondaryServer }
if ($withWins) {
Write-Output "Non compliant: WINS configured"
exit 1
} else {
Write-Output "Compliant: No WINS"
exit 0
}
Conseils de mise en œuvre
- Fréquence : quotidienne suffit en phase de nettoyage.
- Rapport : créez une règle qui remonte la liste des machines non conformes avec la paire de colonnes Serveur / PrimaryWINS (ou SecondaryWINS).
- Remédiation facultative : ne supprimez pas WINS automatiquement tant que les équipes applicatives n’ont pas validé, pour éviter les régressions.
FAQ / cas particuliers
Serveurs multi-homés ou avec teaming (NIC Teaming)
Un même serveur peut exposer plusieurs interfaces actives. L’export du script liste chaque couple Serveur/Carte. Filtrez ensuite sur les lignes où PrimaryWINS
ou SecondaryWINS
n’est pas vide pour obtenir la vue « à traiter ».
Serveurs Core
Aucun impact : les commandes PowerShell fonctionnent de la même manière, et il est souvent plus simple d’auditer à distance un parc Core que d’ouvrir une session locale.
Adaptateurs virtuels (Hyper‑V, VPN, loopback)
Le filtre IPEnabled = True
élimine la majorité des interfaces fantômes. Si un VPN est ponctuellement connecté, il apparaîtra : considérez-le comme un signal utile (le profil VPN peut encore embarquer des paramètres WINS hérités).
Différencier WINS défini par DHCP vs statique
La classe WMI expose la valeur effective vue par le système. Dans un contexte DHCP, vous verrez les adresses transmises par le bail ; dans un contexte statique, la valeur vient de la configuration manuelle. Pour l’audit, la distinction n’est pas nécessaire : dans les deux cas, une adresse WINS configurée doit être retirée au plus vite du socle.
Et si WMI est dégradé ?
Le script se replie automatiquement sur DCOM si WinRM échoue. Si la pile WMI est réellement corrompue sur une machine, utilisez ipconfig /all
pour un relevé ponctuel et planifiez la réparation WMI à part.
Plan d’action recommandé
- Audit initial : exécuter le script PowerShell et produire
Inventaire_WINS.csv
. - Qualification : isoler les lignes où
PrimaryWINS
ouSecondaryWINS
est renseigné. Croiser avec vos responsabilités applicatives. - Assainissement : retirer les adresses WINS des masters, modèles d’OS, scripts de déploiement, et des GPO héritées (si elles en définissaient).
- Contrôle continu : mettre en place un contrôle de conformité (SCCM/Intune) jusqu’à 0 machine non conforme.
- Extinction : couper progressivement les serveurs WINS en surveillant les journaux et en conservant des sauvegardes de base au cas où un équipement ancien réapparaîtrait.
Annexes utiles
Vérifier/ouvrir WinRM par GPO
- Activer « Autoriser la gestion à distance de ce serveur via WinRM » sur les OU de serveurs.
- Ouvrir le groupe de règles de pare‑feu « Gestion à distance Windows » (ports 5985/5986).
- Éviter les configurations non chiffrées ; utilisez Kerberos/HTTPS (certificat) selon vos standards de sécurité.
Format attendu du fichier ListeServeurs.txt
SRV-APP-01
SRV-DB-02
SRV-FICHIERS-03
# Lignes commençant par # ignorées
srv-web-04.contoso.local
10.20.30.40
One‑liners utiles
Lister vite les serveurs d’un groupe AD spécifique :
Get-ADComputer -SearchBase "OU=Serveurs,DC=contoso,DC=local" -LDAPFilter "(objectClass=computer)" |
Select-Object -Expand Name | Out-File .\ListeServeurs.txt
Tester la connectivité WinRM de masse :
Get-Content .\ListeServeurs.txt | ForEach-Object {
try { Test-WSMan $_ -ErrorAction Stop | Out-Null; "$_ : OK" }
catch { "$_ : KO ($($_.Exception.Message))" }
}
Conclusion
Pour identifier rapidement et de manière exhaustive les serveurs Windows Server 2012/2016 qui utilisent encore WINS, l’approche PowerShell basée sur WMI/CIM est de loin la plus efficace : elle s’exécute à distance, ne nécessite aucune intervention manuelle, produit un CSV immédiatement exploitable, et s’intègre ensuite sans effort dans un dispositif de conformité (SCCM/Intune). En suivant le plan d’action proposé (audit → tri → assainissement → contrôle → extinction), vous sécurisez l’arrêt définitif de WINS sans surprise ni régression.
Récapitulatif des points clés
- Commande de base :
Get-CimInstance Win32_NetworkAdapterConfiguration
(filtreIPEnabled=True
). - Champs à examiner :
WINSPrimaryServer
,WINSSecondaryServer
,TcpipNetbiosOptions
. - Sortie : CSV unique (
Inventaire_WINS.csv
) + CSV d’erreurs éventuelles. - Échelle : sessions CIM parallèles, repli DCOM automatique.
- Organisation : filtrage des exceptions, priorisation par équipe/zone, contrôle de conformité continu.