Windows Server 2012/2016 : détecter et inventorier les serveurs avec configuration WINS (PowerShell, WMI/CIM, SCCM/Intune)

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.

Sommaire

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

ApprochePrincipeExtrait / commande cléPoints fortsLimites
Inspection manuelleExécuter ipconfig /all sur chaque serveur ; la section « Serveurs WINS » apparaît si au moins une adresse est configurée.ipconfig /allImmé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_NetworkAdapterConfigurationAutomatisé, 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 :

MessageCause probableCorrectif rapide
The RPC server is unavailablePorts DCOM/RPC filtrés si repli DCOMOuvrir TCP 135 + plage RPC ou forcer WinRM côté serveur
WSManFault / Access is deniedCompte non autorisé à distanceUtiliser un compte admin local/domaine, vérifier la stratégie WinRM
The WinRM client cannot process the requestWinRM 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 :

ValeurInterprétation
0Par défaut (hérité DHCP ou configuration globale)
1Activé explicitement
2Dé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é

  1. Audit initial : exécuter le script PowerShell et produire Inventaire_WINS.csv.
  2. Qualification : isoler les lignes où PrimaryWINS ou SecondaryWINS est renseigné. Croiser avec vos responsabilités applicatives.
  3. 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).
  4. Contrôle continu : mettre en place un contrôle de conformité (SCCM/Intune) jusqu’à 0 machine non conforme.
  5. 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 (filtre IPEnabled=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.
Sommaire