Windows Server 2022 : corriger la recherche plein‑texte des fichiers .XLS (Windows Search, iFilter, Filter Pack)

Sur un serveur de fichiers Windows Server 2022, la recherche plein‑texte échoue pour les fichiers .xls alors qu’elle fonctionne pour .xlsx et PDF via un lecteur réseau. Voici une méthode éprouvée, outillée et sûre pour diagnostiquer, corriger et durcir définitivement votre indexation.

Sommaire

Synthèse de la session

Problème rencontré

Sur un serveur de fichiers Windows Server 2022 (service Windows Search activé, index d’environ 1,6 million de fichiers), la recherche de texte à l’intérieur des fichiers Excel 97‑2003 (.xls) échoue alors qu’elle fonctionne pour les fichiers .xlsx et PDF lorsque les utilisateurs interrogent le partage depuis des postes Windows 11 Pro.

Pourquoi ce symptôme apparaît‑il

  • .xlsx (format Open XML) est pris en charge nativement par Windows Search.
  • .xls (format binaire hérité) s’appuie sur l’iFilter du Microsoft Office 2010 Filter Pack SP2 x64. Sans cet iFilter (ou s’il est « désinscrit »), l’indexeur ne sait pas extraire le texte : la recherche retourne 0 résultat alors que le contenu existe.
  • Les clients Windows peuvent interroger l’index du serveur de fichiers. Si l’indexeur serveur ne produit pas le contenu .xls, aucun poste n’obtient de résultats pour ces fichiers via le partage.

Pistes de diagnostic et d’investigation

VoletActions et vérifications essentielles
Indexation• Dans Options d’indexation › Avancé › Types de fichiers, confirmer que .xls est coché avec l’option « Propriétés et contenu ».
• Lancer ifilttest.exe /d fichier.xls pour vérifier que l’iFilter renvoie bien le texte (voir plus bas si l’outil n’est pas présent).
Filtres Office• Installer ou réinstaller le Microsoft Office 2010 Filter Pack SP2 x64 – requis pour .xls sous Windows Server 2022.
• Contrôler le Registre : HKCR\.xls\PersistentHandler doit pointer vers le GUID de l’iFilter Excel 97‑2003 (commençant par {DFA0B130‑…}).
• Vérifier que InprocServer32 de ce GUID référence offfilt.dll.
Services• Redémarrer Windows Search et Windows Font Cache après chaque modification.
• Si l’index est corrompu : supprimer puis recréer l’index.
Clients Windows 11• Dans Options de l’Explorateur › Recherche, cocher « Toujours rechercher dans le nom de fichier et son contenu » pour forcer la recherche de contenu côté client lorsque nécessaire.
Journaux• Créer une vue personnalisée dans l’Observateur d’événements en filtrant les sources Search et Search‑Core. Rechercher les erreurs 3036/3024 (iFilter non chargé) ou 1006/1017 (index corrompu).

Procédure détaillée de bout en bout

Vérifier la configuration des types de fichiers

  1. Sur le serveur, ouvrir Options d’indexation › Avancé › Types de fichiers.
  2. Rechercher xls. Vérifier que la case est cochée et que Propriétés et contenu est sélectionné.
  3. Valider et quitter. Si vous avez modifié un réglage, redémarrer le service Windows Search.

Contrôler la présence et l’inscription de l’iFilter Excel

Exécuter les commandes suivantes dans une console Administrateur.

:: 1) Le type de fichier .xls doit avoir un PersistentHandler
reg query "HKCR\.xls" /v PersistentHandler

:: 2) Vérifier la DLL associée à l’iFilter (remplacez {DFA0B130-...} par la valeur renvoyée ci‑dessus)
reg query "HKCR\CLSID{DFA0B130-...}\InprocServer32" /ve

:: 3) Si la DLL attendue est offfilt.dll mais introuvable, réinscrivez‑la
regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Filters\offfilt.dll"

Astuce : où trouver ifilttest.exe

L’outil ifilttest.exe n’est pas toujours présent par défaut. Il est fourni avec les kits Windows (outils de développement). Vous pouvez l’exécuter depuis le serveur pour tester le comportement exact de l’iFilter chargé pour .xls.

ifilttest.exe /d "\\Serveur\Partage\Chemin\exemple.xls"

Interprétez le résultat : si du texte lisible s’affiche, l’iFilter fonctionne. Si vous obtenez « Class not registered », « LoadIFilter failed » ou un flux vide, l’iFilter n’est pas disponible ou mal inscrit.

Réinstaller le Filter Pack si nécessaire

Sur Windows Server 2022, utilisez la version x64 Service Pack 2. Une réinstallation silencieuse suivie d’un enregistrement explicite de la DLL corrige la plupart des cas où le composant a été « désinscrit » à la suite d’une mise à jour.

offilter2010sp2-x64.exe /quiet /norestart
regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Filters\offfilt.dll"

Pensez ensuite à reconstruire l’index (voir plus bas).

Redémarrer proprement les services et reconstruire l’index

powershell
# Exécuter en PowerShell élevé sur le serveur
Stop-Service WSearch -Force
# ATTENTION : supprime l’index. À lancer pendant une fenêtre hors production.
Remove-Item -Path "$env:ProgramData\Microsoft\Search" -Recurse -Force
Start-Service WSearch

La reconstruction démarre immédiatement. Sur un corpus de 1,6 million de fichiers, prévoir plusieurs heures et éviter les périodes de forte activité. Le service réutilisera la configuration actuelle (emplacements inclus, types de fichiers, filtres, etc.).

Vérifier l’attribut d’indexation NTFS

Sur les volumes hébergeant le partage : Propriétés du lecteur › Général › cocher Autoriser l’indexation du contenu des fichiers de ce lecteur. Sur le dossier partagé : Propriétés › Avancé… › cocher Autoriser l’indexation du contenu des fichiers de ce dossier. En PowerShell :

Get-Item "D:\Dossiers\Partage" | Select-Object FullName, Attributes
# Le drapeau NotContentIndexed NE doit PAS apparaître

Observer et interpréter les journaux

Dans l’Observateur d’événements : créer une Vue personnalisée filtrant Microsoft‑Windows‑Search et Search‑Core (Journal des applications). Voici un mémo de lecture rapide :

IDSourceSymptômeInterprétationAction recommandée
3024SearchÉchec du chargement d’un iFilterFiltre manquant ou non inscrit pour l’extensionRéinstaller/inscrire offfilt.dll, contrôler PersistentHandler
3036SearchÉchec d’accès au contenuiFilter qui ne renvoie rien, corruption de fluxTester avec ifilttest, recréer l’index
1006Search‑CoreCorruption détectéeIndex incohérentRéinitialisation complète de Windows Search
1017Search‑CoreÉchec récurrent de mappageBase d’index endommagéeSupprimer %ProgramData%\Microsoft\Search et reconstruire

En PowerShell, un filtre rapide :

Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName=@('Microsoft-Windows-Search','Microsoft-Windows-Search-Core')} |
  Where-Object {$_.Id -in 3024,3036,1006,1017} |
  Select-Object TimeCreated, Id, LevelDisplayName, Message |
  Format-List

Tester depuis un client Windows

  • Dans l’Explorateur, ouvrir le partage mappé et rechercher avec content:"terme" (syntaxe AQS) pour cibler le contenu textuel.
  • Activer Options de l’Explorateur › Recherche › « Toujours rechercher dans le nom de fichier et son contenu ».
  • Comparer les résultats ext:xls vs ext:xlsx pour valider le retour de l’iFilter après correction.

Correctifs et solutions proposés

Réinstaller ou réparer le Filter Pack

Réexécuter l’installateur puis ré‑enregistrer explicitement la DLL de filtre afin de rétablir l’association COM et le handler persistant.

offilter2010sp2-x64.exe /quiet /norestart
regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Filters\offfilt.dll"

Ensuite, reconstruire l’index pour que l’indexeur ré‑ingère les .xls.

Réinitialiser entièrement Windows Search

powershell
Stop-Service WSearch
rd /s /q %ProgramData%\Microsoft\Search
Start-Service WSearch

Le dossier et l’index sont recréés proprement au prochain démarrage du service.

Migrer les fichiers en .xlsx

Si votre parc applicatif le permet, convertir les classeurs .xls en .xlsx élimine la dépendance au Filter Pack et bénéficie d’un filtrage natif plus fiable et plus rapide.

Vérifier d’éventuelles interférences antivirus ou sauvegarde

Pour lever un doute, exclure temporairement (en laboratoire) le chemin du partage et le dépôt d’index %ProgramData%\Microsoft\Search\Data\Applications\Windows afin d’observer l’effet sur la progression de l’indexation et la qualité de l’extraction.

Scripts prêts à l’emploi

Audit express des associations .xls

powershell
$ext = '.xls'
$ph = (Get-ItemProperty "Registry::HKEY_CLASSES_ROOT\$ext").PersistentHandler
Write-Host "$ext PersistentHandler = $ph"
if ($ph) {
  $dll = (Get-ItemProperty "Registry::HKEY_CLASSES_ROOT\CLSID\$ph\InprocServer32").'(default)'
  Write-Host "InprocServer32 = $dll"
  if (Test-Path $dll) { Write-Host "DLL trouvée : OK" -ForegroundColor Green }
  else { Write-Host "DLL introuvable : à corriger" -ForegroundColor Red }
} else {
  Write-Host "Pas de PersistentHandler : Filter Pack requis" -ForegroundColor Yellow
}

Forcer la reconstruction d’index et suivre la reprise

powershell
Stop-Service WSearch -Force
Remove-Item -Path "$env:ProgramData\Microsoft\Search" -Recurse -Force
Start-Service WSearch
# Optionnel : surveiller la taille du store et l’activité disque
Get-ChildItem "$env:ProgramData\Microsoft\Search\Data\Applications\Windows" -Recurse |
  Select-Object FullName, Length | Sort-Object Length -Descending | Select-Object -First 10

Conversion en masse .xls → .xlsx via Excel COM

Exécuter sur un poste/service disposant d’Excel (macro sécurité conforme à votre politique). Le script ci‑dessous convertit en place, préserve les dates et les formules simples et journalise les erreurs.

powershell
param([string]$Root = "\\Serveur\Partage\Dossiers")

Add-Type -AssemblyName Microsoft.Office.Interop.Excel
$xl = New-Object -ComObject Excel.Application
$xl.DisplayAlerts = $false

$log = Join-Path $PSScriptRoot "conversion_xls_$(Get-Date -f yyyyMMdd_HHmm).log"
Get-ChildItem $Root -Recurse -Filter *.xls | ForEach-Object {
$src = $*.FullName
$dst = [System.IO.Path]::ChangeExtension($src, '.xlsx')
if (Test-Path $dst) { Add-Content $log "SKIP: $src -> existe déjà"; return }
try {
$wb = $xl.Workbooks.Open($src, $false, $true)
# 51 = xlOpenXMLWorkbook (sans macros)
$wb.SaveAs($dst, 51)
$wb.Close()
Add-Content $log "OK  : $src -> $dst"
} catch {
Add-Content $log "ERR : $src -> $($*.Exception.Message)"
}
}
$xl.Quit()

Remarques : les classeurs avec macros doivent passer en .xlsm (format 52). Testez sur un échantillon et validez l’intégrité fonctionnelle avant bascule massive.

Bonnes pratiques pour un gros index

  • Réduire le périmètre : n’indexer que les emplacements réellement interrogés (exclure archives froides, sauvegardes, images ISO…).
  • Limiter les types : dans Types de fichiers, désactiver les extensions non utiles au métier pour gagner du temps d’ingestion.
  • Planifier : préférez la reconstruction pendant les heures creuses. Une population de 1,6 M de fichiers demande du temps CPU/IO soutenu.
  • Stabilité : après chaque mise à jour cumulative du système, valider la présence de offfilt.dll et l’intégrité du handler persistant.
  • Surveiller : exporter régulièrement les vues d’événements Search/Search‑Core et déclencher des alertes sur 3024/3036/1006/1017.

Checklist opératoire

ÉtapeCommande / ActionRésultat attendu
Vérifier .xls dans Types de fichiersOptions d’indexation › Avancé › Types de fichiersPropriétés et contenu activé
Contrôler PersistentHandlerreg query "HKCR\.xls" /v PersistentHandlerGUID commençant par {DFA0B130-…}
Vérifier la DLLreg query HKCR\CLSID\{GUID}\InprocServer32 /veChemin vers offfilt.dll existant
Tester l’iFilterifilttest.exe /d fichier.xlsTexte extrait lisible
Réparer si besoinoffilter2010sp2-x64.exe /quiet /norestart
regsvr32 offfilt.dll
INSCRIT : iFilter opérationnel
Recréer l’indexStop-Service WSearch
Remove-Item %ProgramData%\Microsoft\Search -Recurse -Force
Start-Service WSearch
Index propre en cours de reconstruction
Valider côté clientExplorateur › content:"mot" ext:xlsRésultats cohérents avec .xlsx/PDF

Points d’attention et pièges fréquents

  • Uninstall « nettoyages » : des outils de « cleanup » peuvent retirer des composants COM et casser l’association iFilter → .xls.
  • Architectures : installez le Filter Pack x64 sur un OS x64. Mélanger x86/x64 entraîne des échecs de chargement du filtre.
  • Droits NTFS : le compte système du service doit lire les fichiers pour l’extraction. Les denies explicites au niveau dossier empêchent l’indexeur de parcourir.
  • Attribut « Non indexé » : ne cochez pas « Ne pas autoriser l’indexation » dans les attributs avancés du dossier, sinon le contenu sera ignoré.
  • Chiffrement : les fichiers chiffrés (EFS) ne sont pas indexés en contenu par défaut. Évitez de confondre ce cas avec un problème d’iFilter.

Foire aux questions

Pourquoi .xlsx fonctionne sans Filter Pack ?

Parce que Windows sait extraire nativement le texte des fichiers Open XML (ZIP + XML). Le format binaire .xls requiert offfilt.dll.

Faut‑il indexer depuis le serveur ou les clients ?

Pour un partage SMB, l’index du serveur fait autorité. Les clients Windows interrogeront ce catalogue si le service Windows Search est actif côté serveur et si les emplacements sont inclus dans l’index.

Combien de temps pour 1,6 M de fichiers ?

Selon la richesse des formats et la charge, comptez plusieurs heures. Planifiez la reconstruction la nuit ou le week‑end et surveillez les journaux d’anomalies.

Que faire si un correctif cumulatif casse de nouveau la recherche ?

Rejouer la séquence courte : vérifier PersistentHandler → réinscrire offfilt.dll → redémarrer Windows Search → tester avec ifilttest → reconstruire l’index si l’anomalie persiste.

Conclusion

Le blocage de la recherche plein‑texte sur .xls en environnement Windows Server 2022 provient quasi systématiquement d’un iFilter manquant ou mal inscrit. En réinstallant le Filter Pack, en validant l’association PersistentHandler → offfilt.dll avec ifilttest puis en reconstruisant l’index, vous restaurez un service de recherche homogène pour tous les utilisateurs. La conversion des classeurs hérités vers .xlsx constitue la voie la plus pérenne pour réduire la dette technique et simplifier l’exploitation.

Annexe : informations complémentaires utiles

PointDétail
Temps d’indexationAvec 1,6 million de fichiers, la reconstruction peut nécessiter plusieurs heures ; planifiez en heures creuses et surveillez les événements.
ObsolescenceLe Filter Pack Office n’est plus maintenu ; certaines mises à jour de sécurité peuvent « désinscrire » le composant. Gardez un script de remédiation prêt.
Conversion rapidePowerShell peut industrialiser la conversion .xls → .xlsx via Excel COM ou via des scripts Office si Microsoft 365 est disponible.

Encadré : playbook minimal en trois commandes

:: Réparer le Filter Pack
offilter2010sp2-x64.exe /quiet /norestart
regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Filters\offfilt.dll"

:: Réinitialiser l’index
powershell -NoLogo -NoProfile -Command ^
"Stop-Service WSearch; Remove-Item -Path `"%ProgramData%\Microsoft\Search`" -Recurse -Force; Start-Service WSearch"

:: Vérifier côté client

# Explorateur : content:"votre_terme" ext:xls

Résumé exécutable

  • Confirmer .xls = Propriétés et contenu dans l’interface d’indexation.
  • Vérifier HKCR\.xls\PersistentHandler → iFilter Excel ({DFA0B130‑…}), InprocServer32 = offfilt.dll.
  • Tester ifilttest.exe /d sur un .xls représentatif.
  • Réinstaller Office 2010 Filter Pack SP2 x64 et regsvr32 offfilt.dll.
  • Réinitialiser Windows Search si l’index est douteux.
  • Valider depuis un client Windows 11 avec AQS content: et comparer .xls vs .xlsx.
  • Option stratégique : convertir le stock .xls en .xlsx.
Sommaire