Corriger Kernel‑EventTracing ID 2 (0xC0000035) sur Windows Server — SensorFramework & ETW

Sur certains serveurs Windows, l’Observateur d’événements affiche « Kernel‑EventTracing / 2 : SensorFramework‑{GUID}… 0xC0000035 ». Ce guide expose la cause (collision de nom ETW), un diagnostic reproductible et des correctifs sûrs, avec scripts pour l’automatiser à grande échelle.

Sommaire

Vue d’ensemble de l’erreur et de sa cause

Le journal Kernel‑EventTracing peut enregistrer régulièrement le message :

Session « SensorFramework‑{GUID} » failed to start with the following error: 0xC0000035

Le code 0xC0000035 correspond à STATUS_OBJECT_NAME_COLLISION : Windows tente de créer une session ETW (Event Tracing for Windows) qui porte un nom déjà utilisé ou qui n’a pas été correctement libéré après une exécution précédente. Résultat : la session SensorFramework‑{GUID} échoue au démarrage et l’événement ID 2 est journalisé.

Pourquoi « SensorFramework » ? Ce préfixe renvoie à la Windows Sensor Platform (pilotes et services liés aux capteurs : luminosité ambiante, rotation, emplacement, etc.). Sur des serveurs, ces fonctions sont rarement nécessaires ; néanmoins, un pilote, un service, une tâche planifiée, un script ou une stratégie peut créer une session de traçage portant ce nom.

Ce que signifie concrètement l’ID 2

  • Symptôme : l’événement Kernel‑EventTracing / ID 2 apparaît, parfois à chaque démarrage ou de façon périodique.
  • Interprétation : Windows n’a pas pu démarrer la session car un objet du même nom existe déjà (session encore ouverte, « zombie », autologger qui persiste, ou double démarrage).
  • Impact : bruit dans les journaux, éventuelle perte de traces utiles, et suspicion d’un composant qui gère mal son cycle de vie.

Diagnostic pas à pas

Objectif : vérifier si une session portant SensorFramework est active, identifier qui la démarre, puis corriger la cause racine.

Où regarder et quoi chercher

Emplacement / CommandeButExemple / Indice attendu
Observateur d’événements
Applications and Services Logs → Microsoft → Windows → Kernel‑EventTracingAdmin
Confirmer les ID 2 et le texte exact (SensorFramework‑{GUID}, 0xC0000035)Plusieurs occurrences corrélées à un redémarrage ou à une tâche planifiée
logman query -ets (CMD en admin)Lister les sessions ETW en coursPrésence d’une session SensorFramework‑… → conflit probable
PerfMon → Jeux de collecteurs de données → Sessions de suivi d’événementsVue GUI des sessions, état, fournisseur, tamponSession SensorFramework‑{GUID} en Exécution ou Arrêtée mais présente
Get-Service *sensor* (PowerShell)Identifier des services « capteurs » pouvant recréer la sessionServices liés aux capteurs activés sur un serveur non concerné
Planificateur de tâches / Scripts de démarrageDétecter un démarrage régulier de traçage (logman, wpr, etc.)Tâche qui exécute logman start avec un nom SensorFramework
Stratégies de groupe (GPO)Voir si des scripts ou paramètres créent/recréent des sessionsScript d’ordinateur qui lance un traçage ETW à chaque boot
reg query HKLM\System\CurrentControlSet\Control\WMI\Autologger /sInspection en lecture des autologgers qui démarrent au bootClés contenant SensorFramework → source potentielle

Filtrer rapidement les événements au format XML (PowerShell)

Pour compter les occurrences récentes par machine :

$log = 'Microsoft-Windows-Kernel-EventTracing/Admin'
$xpath = "*[System[(EventID=2)] and EventData[Data[contains(.,'SensorFramework')]]]"
Get-WinEvent -LogName $log -FilterXPath $xpath -MaxEvents 200 |
  Group-Object MachineName | Sort-Object Count -Descending |
  Format-Table Name,Count

Correctifs immédiats (sans redémarrage)

Idée directrice : supprimer la session ETW en double et empêcher sa recréation incorrecte.

Arrêter et supprimer la session en conflit

  1. Ouvrez CMD en administrateur puis exécutez :
    logman query -ets Recherchez une session qui commence par SensorFramework-.
  2. Si trouvée, arrêtez puis supprimez la session :
    logman stop "NomExactDeLaSession" -ets logman delete "NomExactDeLaSession" -ets
  3. Alternative GUI : dans PerfMonJeux de collecteurs de donnéesSessions de suivi d’événements : clic droit sur SensorFramework‑{GUID}Arrêter puis Supprimer.

Redémarrer WMI si une dépendance maintient la session ouverte

Dans certains environnements, un composant WMI peut conserver la session. Redémarrez prudemment WMI :

net stop winmgmt
net start winmgmt

Si vous utilisez la journalisation ou des outils d’inventaire intensifs, planifiez cette action hors des heures de pointe.

Vérifier et neutraliser la recréation automatique

  • Stratégies de groupe : inspectez les scripts d’ordinateur (démarrage) qui appellent logman, wpr ou similaires.
  • Planificateur de tâches : recherchez une tâche qui démarre régulièrement un traçage SensorFramework.
  • Pilotes / services « capteurs » : si les capteurs ne sont pas utilisés sur serveurs, envisagez de désactiver prudemment les services correspondants après validation sur un serveur pilote.

Pour recenser les services susceptibles d’être en cause :

Get-Service | Where-Object {$_.DisplayName -match 'Sensor' -or $_.Name -match 'Sensor'} |
  Select-Object Status, Name, DisplayName

Bonnes pratiques : mettez d’abord les services en Manual, vérifiez l’absence d’impact (applications métier, sécurité, télémetrie) puis, si OK, passez en Disabled et surveillez les journaux.

Points d’attention importants

  • Ne confondez pas : wevtutil gère les journaux (canaux, fichiers .evtx), tandis que logman gère les sessions ETW. Pour ce problème précis, utilisez logman ou PerfMon.
  • Un simple redémarrage peut libérer une session verrouillée mais ne corrige pas la cause de sa recréation. Traitez la source (service, tâche, GPO, script).
  • Si la session provient d’un Autologger, elle redémarrera à chaque boot. Évitez la suppression brutale de clés Registre en production ; mieux vaut corriger le composant qui crée la session.

Exemples concrets de commandes utiles

Inventaire express des sessions ETW

:: Lister les sessions ETW actives
logman query -ets

\:: Détails d'une session (tampons, fichier, statut)
logman query "SensorFramework-{GUID}" -ets 

Recherche de tâches qui démarrent des traces

Get-ScheduledTask | ForEach-Object {
  try {
    $xml = [xml](Export-ScheduledTask -TaskName $_.TaskName -TaskPath $_.TaskPath)
    if ($xml.Task.Actions.Exec.Command -match 'logman|wpr') {
      [PSCustomObject]@{
        Task     = $_.TaskName
        Path     = $_.TaskPath
        Command  = $xml.Task.Actions.Exec.Command
        Args     = $xml.Task.Actions.Exec.Arguments
      }
    }
  } catch {}
} | Format-Table -AutoSize

Inspection non destructive des autologgers

reg query HKLM\System\CurrentControlSet\Control\WMI\Autologger /s | findstr /I SensorFramework

But : identifier une clé d’autologger « SensorFramework… » susceptible de provoquer la recréation à chaque démarrage. Corrigez la source (service/tâche/GPO) plutôt que d’éditer la clé en direct.

Automatisation PowerShell pour plusieurs serveurs

Le fragment suivant arrête/supprime toute session qui correspond à SensorFramework‑ sur un ensemble de machines. Testez toujours sur un périmètre pilote.

$servers = @('srv01','srv02','srv03')
$pattern = '^SensorFramework-'

\$script = {
\$sessions = & logman query -ets | Select-String -Pattern \$using\:pattern | ForEach-Object { $\_.Line.Trim() }
foreach (\$s in \$sessions) {
try { & logman stop \$s -ets | Out-Null } catch {}
try { & logman delete \$s -ets | Out-Null } catch {}
}

# Redémarrer WMI si besoin (décommenter si nécessaire)

# Start-Process -FilePath 'cmd.exe' -ArgumentList '/c','net stop winmgmt && net start winmgmt' -Verb RunAs

}

Invoke-Command -ComputerName \$servers -ScriptBlock \$script 

Version avec journalisation et mode WhatIf

Pour tracer ce qui est fait et pouvoir rejouer/justifier, utilisez un journal CSV et un interrupteur WhatIf :

param(
  [string[]]$ComputerName,
  [switch]$WhatIf,
  [string]$OutCsv = ".\Etw_SensorFramework_Cleanup_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
)

\$results = @()

\$sb = {
param(\$Pattern, \$DoIt)
\$found = & logman query -ets | Select-String -Pattern \$Pattern | ForEach-Object { $\_.Line.Trim() }
foreach (\$name in \$found) {
if (\$DoIt) {
try { & logman stop \$name -ets | Out-Null } catch {}
try { & logman delete \$name -ets | Out-Null } catch {}
}
}
return \$found
}

foreach (\$c in \$ComputerName) {
try {
\$sessions = Invoke-Command -ComputerName \$c -ScriptBlock \$sb -ArgumentList '^SensorFramework-', (-not \$WhatIf)
\$results += \[PSCustomObject]@{ Computer=\$c; Timestamp=Get-Date; Found=\$sessions -join ';'; Action=(\$(if(\$WhatIf){'Planned'}else{'Executed'})) }
} catch {
\$results += \[PSCustomObject]@{ Computer=\$c; Timestamp=Get-Date; Found='ERROR'; Action=$\_.Exception.Message }
}
}

\$results | Export-Csv -NoTypeInformation -Path \$OutCsv
Write-Host "Journal écrit :" (Resolve-Path \$OutCsv) 

Prévention et bonnes pratiques

  • Nommer de façon unique toute session ETW démarrée par vos scripts ou outils internes. Par exemple, inclure le nom de machine ou un GUID pour éviter les collisions :
    logman start "MyTrace-%COMPUTERNAME%-%RANDOM%" -ets -p {GUID_FOURNISSEUR} 0xFFFFFFFF 0x5
  • Conditionner le démarrage : ne démarrer que si la session n’existe pas déjà.
    if (-not (logman query -ets | Select-String -Quiet -Pattern '^SensorFramework-')) { logman start "SensorFramework-$(New-Guid)" -ets }
  • Superviser la présence répétée des ID 2 pour déclencher une alerte « bruit anormal » sur Kernel‑EventTracing/Admin.
  • Capteurs inutilisés : sur des serveurs dédiés, désactivez les fonctionnalités de capteurs via services/GPO lorsque validé par les équipes applicatives et sécurité.

Contrôles après remédiation

  1. Exécutez logman query -ets : aucune session ne doit commencer par SensorFramework- tant que vous n’en avez pas explicitement besoin.
  2. Surveillez pendant quelques cycles de démarrage et de tâches planifiées : l’ID 2 doit avoir disparu du journal Kernel‑EventTracing/Admin.
  3. Validez que les applications métier et la collecte de journaux fonctionnent normalement.

Dépannage avancé

Quand le problème réapparaît après suppression

Dans ce cas, quelque chose recrée la session : un service capteur, un driver, un script d’observabilité, un outil de performance (WPR/WPA), une GPO. Utilisez la corrélation temporelle :

  • Notez l’heure de l’ID 2 et recherchez les événements applicatifs ou système générés à la même minute.
  • Activez la journalisation d’audit sur vos scripts de démarrage, si applicable.
  • Inspectez les tâches planifiées déclenchées à l’ouverture de session système ou à heure fixe.

Cas des autologgers

Un autologger est une session ETW qui démarre très tôt au boot. Si une clé Autologger liée à SensorFramework existe, vous devez corriger l’élément qui l’installe (package, pilote, GPO). Évitez la suppression directe ; procédez par mise à jour du composant ou ajustement de configuration afin de rester supportable.

Foire aux questions

Peut‑on ignorer cet événement ?

Ignorer l’ID 2 ne casse pas immédiatement le système, mais : 1) vous perdez la trace attendue par la session, 2) vous masquez un défaut de cycle de vie, 3) vous bruitez la télémétrie. Il vaut mieux corriger la cause.

Un redémarrage suffit‑il ?

Parfois, oui : il libère l’objet ETW. Mais si la session est recréée de manière fautive au démarrage (autologger/script), le problème revient. Le seul correctif durable consiste à supprimer la session en double et empêcher sa recréation erronée.

Quels services « capteurs » viser sur serveur ?

Cela dépend des versions et des rôles installés. La règle : si vous n’utilisez pas de capteurs, recensez les services dont le nom ou l’affichage contient « Sensor » et évaluez l’impact avant désactivation contrôlée. Procédez par vague pilote, puis généralisation.

Quelle différence entre wevtutil et logman ?

wevtutil manipule des canaux de journaux (logs), pas des sessions ETW. Pour créer, arrêter, supprimer des sessions ETW, utilisez logman (ou PerfMon).

Modèle d’intervention réutilisable

ÉtapeActionCritère de succèsPlan de repli
ValidationConfirmer ID 2 & 0xC0000035 pour SensorFrameworkÉvénement reproduit et horodatéN/A
Arrêt/suppressionlogman stop/delete de la session en doubleSession n’apparaît plus dans logman query -etsRedémarrer WMI, puis réessayer
Blocage recréationCorriger service/tâche/GPO à l’origineAbsence d’ID 2 sur 48–72 hRevenir à l’état précédent et revoir la stratégie
PréventionNoms uniques + démarrage conditionnel des tracesAucune collision de nomRevue de code/ops des scripts

Exemple de script d’audit de l’environnement

Ce script dresse l’inventaire des occurrences récentes de l’ID 2 « SensorFramework » sur une liste de serveurs et produit un rapport CSV.

param(
  [Parameter(Mandatory=$true)]
  [string]$ServerListPath,
  [string]$OutCsv = ".\SensorFramework_EventID2_Audit_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
)

\$servers = Get-Content -Path \$ServerListPath | Where-Object {$\_ -and $\_.Trim() -ne ''}

\$log = 'Microsoft-Windows-Kernel-EventTracing/Admin'
\$xpath = "\*\[System\[(EventID=2)] and EventData\[Data\[contains(.,'SensorFramework')]]]"

\$rows = foreach (\$s in \$servers) {
try {
\$events = Get-WinEvent -ComputerName \$s -LogName \$log -FilterXPath \$xpath -MaxEvents 100
\[PSCustomObject]@{
Computer   = \$s
Count      = \$events.Count
LastSeen   = (\$events | Select-Object -First 1).TimeCreated
}
} catch {
\[PSCustomObject]@{ Computer=\$s; Count=0; LastSeen=\$null }
}
}

\$rows | Sort-Object Count -Descending | Export-Csv -NoTypeInformation -Path \$OutCsv
Write-Host "Rapport :" (Resolve-Path \$OutCsv) 

Résumé opérationnel

  • Constat : l’événement Kernel‑EventTracing / ID 2 avec 0xC0000035 indique une collision de nom de session ETW, ici SensorFramework‑{GUID}.
  • Action immédiate : supprimer la session en double (logman stop/delete) et, si nécessaire, redémarrer WMI.
  • Action durable : empêcher la recréation via correction du service/tâche/GPO/driver qui lance la session.
  • Prévention : nommer les sessions de façon unique et conditionner leur démarrage.

Résultat attendu

Après nettoyage des sessions ETW en double et correction de la source (tâche, GPO, pilote/service capteur), les événements Kernel‑EventTracing / ID 2 liés à SensorFramework‑{GUID} cessent d’apparaître. Le journal redevient sain, les traces utiles fonctionnent et les opérations gagnent en lisibilité.

Sommaire