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.
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
Volet | Actions 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
- Sur le serveur, ouvrir Options d’indexation › Avancé › Types de fichiers.
- Rechercher
xls
. Vérifier que la case est cochée et que Propriétés et contenu est sélectionné. - 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 :
ID | Source | Symptôme | Interprétation | Action recommandée |
---|---|---|---|---|
3024 | Search | Échec du chargement d’un iFilter | Filtre manquant ou non inscrit pour l’extension | Réinstaller/inscrire offfilt.dll , contrôler PersistentHandler |
3036 | Search | Échec d’accès au contenu | iFilter qui ne renvoie rien, corruption de flux | Tester avec ifilttest , recréer l’index |
1006 | Search‑Core | Corruption détectée | Index incohérent | Réinitialisation complète de Windows Search |
1017 | Search‑Core | Échec récurrent de mappage | Base d’index endommagée | Supprimer %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
vsext: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
Étape | Commande / Action | Résultat attendu |
---|---|---|
Vérifier .xls dans Types de fichiers | Options d’indexation › Avancé › Types de fichiers | Propriétés et contenu activé |
Contrôler PersistentHandler | reg query "HKCR\.xls" /v PersistentHandler | GUID commençant par {DFA0B130-…} |
Vérifier la DLL | reg query HKCR\CLSID\{GUID}\InprocServer32 /ve | Chemin vers offfilt.dll existant |
Tester l’iFilter | ifilttest.exe /d fichier.xls | Texte extrait lisible |
Réparer si besoin | offilter2010sp2-x64.exe /quiet /norestart regsvr32 offfilt.dll | INSCRIT : iFilter opérationnel |
Recréer l’index | Stop-Service WSearch Remove-Item %ProgramData%\Microsoft\Search -Recurse -Force Start-Service WSearch | Index propre en cours de reconstruction |
Valider côté client | Explorateur › content:"mot" ext:xls | Ré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
Point | Détail |
---|---|
Temps d’indexation | Avec 1,6 million de fichiers, la reconstruction peut nécessiter plusieurs heures ; planifiez en heures creuses et surveillez les événements. |
Obsolescence | Le 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 rapide | PowerShell 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
.