Windows Server : 15 commandes PowerShell pour diagnostiquer sans redémarrer

Vérifiez services, événements, CPU, mémoire, disques, DNS et ports avec 15 recettes diagnostiques, leurs permissions et leurs limites, sans correction automatique.

01

Collecter les indices avant de redémarrer

Un serveur lent ou une application inaccessible ne justifie pas immédiatement un redémarrage. Les 15 recettes ci-dessous aident à séparer service, système, mémoire, CPU, stockage et réseau. Elles ne modifient pas la configuration; les tests DNS et TCP produisent toutefois du trafic. Choisissez les vérifications utiles au symptôme plutôt que de tout exécuter en boucle.

Notez le serveur, le service touché, le début du problème avec fuseau horaire, les utilisateurs concernés et les derniers changements. Préservez les journaux avant une intervention. Ce guide est un premier diagnostic ciblé, pas un audit complet ni une promesse de résoudre chaque incident sans redémarrage.

02

Environnement et permissions

Les exemples sont conçus pour une exécution locale dans Windows PowerShell 5.1, présent sur Windows Server 2019, 2022 et 2025, avec les modules Windows correspondants. PowerShell 7 peut convenir selon leur compatibilité; un module Windows absent ou chargé par une couche de compatibilité peut produire des objets désérialisés. Vérifiez les commandes disponibles avant d’interpréter un résultat vide.

Aucun agent ni module commercial supplémentaire n’est requis pour ces commandes; les licences du système et des applications restent applicables. Utilisez une identité autorisée avec les droits de lecture nécessaires. Une élévation peut être requise pour certains journaux, processus, volumes ou compteurs, mais n’accordez pas Domain Admin pour ce diagnostic.

  • Les noms ContosoApp et app.contoso.example sont fictifs : remplacez-les par un service et une cible autorisés.
  • Si une commande échoue, conservez l’erreur. Ne transformez pas « accès refusé », « aucun événement correspondant » ou « commande absente » en état sain.
  • À distance, utilisez un accès administré déjà approuvé. Ne lancez pas Enable-PSRemoting, ne changez pas TrustedHosts et ne contournez pas TLS pour dépanner. Les exemples ci-dessous restent locaux.
CollecteDroits à vérifier
CIM et servicesLecture du namespace WMI et ACL des services; restrictions possibles selon le fournisseur.
ÉvénementsACL des journaux; Event Log Readers lorsque suffisant. Security n’est pas collecté ici.
CompteursPerformance Monitor Users lorsque suffisant; certains objets exigent une élévation.
Processus, volumes et réseauLecture locale; visibilité partielle possible. Élever seulement une collecte autorisée qui l’exige.
03

1. Identifier le système et le dernier démarrage

Confirmez d’abord le bon serveur et sa version. Une longue disponibilité n’est pas une cause de panne; rapprochez le dernier démarrage du début du symptôme et des changements. CIM local utilise ici les droits de lecture du fournisseur WMI.

Diagnostic — aucune modification de configuration
Get-CimInstance Win32_OperatingSystem -ErrorAction Stop |
  Select-Object CSName,Caption,Version,BuildNumber,LastBootUpTime,
    @{Name='UptimeDays';Expression={[math]::Round(((Get-Date)-$_.LastBootUpTime).TotalDays,2)}}
04

2. Repérer les services automatiques arrêtés

Une liste de candidats, pas une liste de pannes : démarrage différé, déclencheurs et rôles inutilisés peuvent expliquer l’arrêt. Confirmez l’état attendu et corrélez ExitCode aux événements. Ne démarrez pas tout en bloc.

Diagnostic — aucune modification de configuration
Get-CimInstance Win32_Service -Filter "StartMode='Auto' AND State<>'Running'" -ErrorAction Stop |
  Select-Object Name,DisplayName,State,StartMode,StartName,ExitCode
05

3. Examiner les dépendances d’un service précis

ServicesDependedOn indique les prérequis; DependentServices indique les services qui en dépendent. L’accès dépend de l’ACL du gestionnaire de services et du service. Un nom inconnu ou un accès refusé est une erreur de collecte, pas la preuve que le service est arrêté.

Diagnostic — aucune modification de configuration
# Replace with an existing service NAME, not its display label
$serviceName = 'ContosoApp' # fictional
$service = Get-Service -Name $serviceName -ErrorAction Stop
$service | Select-Object Name,Status
$service.ServicesDependedOn | Select-Object Name,Status
$service.DependentServices | Select-Object Name,Status
06

4. Lire les erreurs et avertissements du système

Le filtre s’applique à la source et la collecte est bornée. Les 100 événements sont les plus récents qui correspondent; ce n’est pas tout l’historique. L’accès dépend du journal : utilisez Event Log Readers ou une délégation adaptée lorsque possible. Distinguez zéro résultat et accès refusé.

Diagnostic — aucune modification de configuration
Get-WinEvent -FilterHashtable @{
  LogName='System'; Level=1,2,3; StartTime=(Get-Date).AddHours(-2)
} -MaxEvents 100 -ErrorAction Stop |
  Select-Object TimeCreated,ProviderName,Id,LevelDisplayName,Message
07

5. Corréler les événements applicatifs

Cherchez une répétition autour du symptôme plutôt qu’un événement isolé. Certains produits écrivent dans leurs propres journaux, fichiers ou canaux Applications and Services Logs. Protégez les messages exportés : ils peuvent contenir des identifiants et des chemins sensibles.

Diagnostic — aucune modification de configuration
Get-WinEvent -FilterHashtable @{
  LogName='Application'; Level=1,2,3; StartTime=(Get-Date).AddHours(-2)
} -MaxEvents 100 -ErrorAction Stop |
  Select-Object TimeCreated,ProviderName,Id,Message
08

6. Mesurer la mémoire visible et disponible

Ces propriétés sont exprimées en Kio, d’où la division par 1MB pour obtenir des Gio. Une faible mémoire libre ne prouve pas une fuite : caches, charge et engagement mémoire comptent. Comparez plusieurs périodes et la référence habituelle du serveur.

Diagnostic — aucune modification de configuration
Get-CimInstance Win32_OperatingSystem -ErrorAction Stop |
  Select-Object @{Name='TotalGiB';Expression={[math]::Round($_.TotalVisibleMemorySize/1MB,2)}},
    @{Name='FreeGiB';Expression={[math]::Round($_.FreePhysicalMemory/1MB,2)}},
    @{Name='FreePct';Expression={[math]::Round(100*$_.FreePhysicalMemory/$_.TotalVisibleMemorySize,1)}}
09

7. Échantillonner la charge CPU

Trois observations légères évitent de conclure sur un seul instant. LoadPercentage est une mesure par processeur avec sa fenêtre de calcul, pas une trace fine par cœur. En VM, une contention de l’hôte peut nécessiter les métriques de l’hyperviseur.

Diagnostic — aucune modification de configuration
1..3 | ForEach-Object {
  Get-CimInstance Win32_Processor -ErrorAction Stop |
    Select-Object @{Name='ObservedAt';Expression={Get-Date}},DeviceID,LoadPercentage
  if ($_ -lt 3) { Start-Sleep -Seconds 2 }
}
10

8. Trier les processus par temps CPU cumulé

CPU est un temps processeur cumulé en secondes, pas un pourcentage actuel. Un vieux processus peut arriver en tête sans être responsable du pic présent. StartTime ou d’autres propriétés peuvent être inaccessibles sur les processus protégés; ne les arrêtez pas pour vérifier une hypothèse.

Diagnostic — aucune modification de configuration
Get-Process -ErrorAction Stop |
  Sort-Object CPU -Descending |
  Select-Object -First 10 Id,ProcessName,CPU,StartTime
11

9. Comparer mémoire résidente et privée des processus

WorkingSet64 décrit la mémoire physique résidente; PrivateMemorySize64 décrit une allocation privée, pas nécessairement entièrement en RAM. Le partage des pages empêche de simplement additionner les working sets. Confirmez une croissance persistante avant de parler de fuite.

Diagnostic — aucune modification de configuration
Get-Process -ErrorAction Stop |
  Sort-Object WorkingSet64 -Descending |
  Select-Object -First 10 Id,ProcessName,
    @{Name='WorkingSetMiB';Expression={[math]::Round($_.WorkingSet64/1MB,1)}},
    @{Name='PrivateMiB';Expression={[math]::Round($_.PrivateMemorySize64/1MB,1)}}
12

10. Vérifier l’espace des volumes

Incluez les volumes sans lettre, les points de montage et les volumes de données. Un statut Healthy ne démontre pas la santé de la baie ou du système de fichiers au complet. Une réserve se dimensionne selon la croissance, les transactions et la maintenance; évitez un pourcentage universel.

Diagnostic — aucune modification de configuration
Get-Volume -ErrorAction Stop |
  Select-Object DriveLetter,FileSystemLabel,FileSystem,HealthStatus,OperationalStatus,
    @{Name='SizeGiB';Expression={[math]::Round($_.Size/1GB,1)}},
    @{Name='FreeGiB';Expression={[math]::Round($_.SizeRemaining/1GB,1)}}
13

11. Observer les latences disque sur une courte fenêtre

Les noms de compteurs sont localisés; un chemin anglais invalide n’indique pas un disque défaillant. Utilisez les chemins réels retournés sur le serveur. Performance Monitor Users ou une élévation autorisée peut être nécessaire. Comparez latence, charge et stockage sous-jacent; peu d’E/S donne peu de matière pour conclure.

Diagnostic — aucune modification de configuration
# English counter names: replace with LOCALIZED paths on a French OS.
# Discover local paths with: Get-Counter -ListSet *
$paths = @(
  '\PhysicalDisk(*)\Avg. Disk sec/Read',
  '\PhysicalDisk(*)\Avg. Disk sec/Write'
)
Get-Counter -Counter $paths -SampleInterval 2 -MaxSamples 3 -ErrorAction Stop |
  ForEach-Object { $_.CounterSamples |
    Select-Object Timestamp,Path,
      @{Name='LatencyMs';Expression={[math]::Round($_.CookedValue*1000,2)}},Status }
14

12. Lire la configuration IP et DNS

-All inclut les interfaces virtuelles et déconnectées. Comparez IP, passerelle et serveurs DNS avec l’architecture attendue. Plusieurs interfaces et routes peuvent changer la source réellement utilisée; ne modifiez pas la passerelle ou les DNS pendant la collecte.

Diagnostic — aucune modification de configuration
Get-NetIPConfiguration -All -Detailed -ErrorAction Stop
15

13. Vérifier une résolution DNS précise

Ce test A ne couvre pas les réponses AAAA ni les SRV. Au besoin, répétez pour le type réellement utilisé et comparez les résolveurs internes autorisés avec -Server. Un succès ponctuel n’exclut pas une panne intermittente; ne videz pas le cache avant de préserver les indices.

Diagnostic — aucune modification de configuration
# Fictional application name; use an approved real target
Resolve-DnsName -Name 'app.contoso.example' -Type A -DnsOnly -ErrorAction Stop |
  Select-Object Name,Type,IPAddress,TTL
16

14. Tester le port TCP d’une dépendance

Cette commande établit une connexion de test : lecture diagnostique, mais trafic réel pouvant être journalisé. TcpTestSucceeded ne valide ni TLS, ni authentification, ni transaction applicative. Testez depuis le client touché et depuis le serveur pour distinguer les chemins; cela ne teste pas UDP.

Diagnostic — aucune modification de configuration
# Active network probe: approved host and one expected port only
Test-NetConnection -ComputerName 'app.contoso.example' -Port 443 -InformationLevel Detailed
17

15. Relier les ports en écoute aux PID

OwningProcess permet un rapprochement, mais un processus peut se terminer et un PID être réutilisé. Une écoute locale ne prouve pas l’accès distant à travers le pare-feu. La visibilité dépend des droits; gardez adresse locale et IPv4/IPv6 dans l’analyse.

Diagnostic — aucune modification de configuration
Get-NetTCPConnection -State Listen -ErrorAction Stop |
  Select-Object LocalAddress,LocalPort,OwningProcess |
  Sort-Object LocalPort
# Read the identified PID without assigning to the reserved $PID variable:
# Get-Process -Id 1234 -ErrorAction Stop
18

Lire les résultats ensemble

Exemple fictif : ContosoApp est démarré, son port écoute et le test TCP depuis le client réussit, mais les utilisateurs voient encore une erreur. La prochaine étape est un test applicatif, des journaux du produit et ses dépendances, pas un redémarrage à l’aveugle. À l’inverse, des latences disque élevées pendant les sauvegardes orientent une comparaison avec la baie, l’hyperviseur et la fenêtre de sauvegarde.

Les mesures ponctuelles ne remplacent pas une série temporelle. Relevez l’heure et la durée de chaque échantillon, comparez une période normale à la période touchée et confirmez la cohérence des horloges. Évitez les seuils CPU, mémoire ou disque universels : une valeur prend son sens avec la charge et le délai de réponse attendu.

19

Conserver un relevé exploitable

Exportez uniquement les champs nécessaires dans un emplacement à accès limité, avec une durée de conservation. Ne publiez pas de journaux bruts dans un ticket public. Les noms de comptes, adresses, chemins et messages applicatifs peuvent révéler des données sensibles.

ChampExemple fictif
Périmètre et impactsrv-app-demo; application lente pour une équipe
Heure et indices14:05 UTC; erreurs applicatives répétées; port accessible
Hypothèse à confirmerDépendance de base de données ou stockage
Prochaine vérificationCorréler journaux applicatifs et métriques de la dépendance
Responsable et validationPropriétaire applicatif; transaction représentative après intervention
20

Si une correction devient nécessaire

  • Formulez une hypothèse vérifiable et faites confirmer l’impact par le propriétaire du service.
  • Séparez toute écriture de la collecte : modification de configuration, redémarrage de service ou de serveur, correctif et changement réseau demandent leur propre intervention.
  • Préparez une sauvegarde ou un état de configuration pertinent, une fenêtre, un pilote et un retour arrière adapté. Une simple copie d’écran ne remplace pas une restauration testée.
  • Après intervention, répétez les seules mesures pertinentes et un test utilisateur représentatif. Comparez avec le relevé initial et surveillez la réapparition.
  • Ne désactivez pas globalement antivirus, pare-feu ou contrôles d’accès pour gagner du temps. Les traces détaillées, captures et dumps nécessitent aussi une portée, une durée et une gestion des données.
  • Si le serveur devient instable ou l’impact critique, suivez la procédure d’incident et de disponibilité : préserver les indices ne doit pas retarder sans raison une récupération nécessaire.
21

Aller au-delà du premier diagnostic

Ces commandes permettent de mieux cadrer un incident et de transmettre des faits utiles. Des problèmes récurrents demandent une analyse des dépendances, de la supervision et de l’architecture. Un accompagnement infrastructure peut aider à relier les observations au risque métier et à préparer des corrections mesurées.