Sous IIS, la commande appcmd list requests
peut échouer avec « Not implemented (0x80004001) ». Ce guide explique les causes les plus courantes (Request Monitor manquant, installation corrompue, contexte d’exécution) et propose des solutions fiables, plus des alternatives (FREB, ETW).
Vue d’ensemble du problème
Lors de l’exécution de %windir%\system32\inetsrv\appcmd list requests
, IIS affiche :
ERROR ( hresult:80004001, message: Command execution failed. Not implemented )
Aucun événement pertinent n’apparaît dans l’Observateur d’événements, même depuis une invite de commandes élevée (session Administrator). Cela signale presque toujours que la fonctionnalité Request Monitor n’est pas présente ou non chargée, et non un problème de syntaxe de la commande.
Symptômes typiques
appcmd list requests
renvoie immédiatement l’erreur0x80004001 (E_NOTIMPL)
.appcmd list wp
(processus de travail) fonctionne, mais l’affichage des requêtes reste impossible.- L’interface IIS Manager montre les processus (Worker Processes) mais l’onglet Requests reste vide ou ne s’initialise qu’après une première requête.
- Aucune entrée explicite dans Application ou System (Event Viewer) liée à AppCmd ou au Request Monitor.
Causes probables
Piste | Explications rapides |
---|---|
Fonctionnalité manquante | L’outil AppCmd ne peut lister les requêtes que si la fonctionnalité Request Monitor est installée et chargée. |
Installation IIS corrompue | Des composants « Health & Diagnostics » peuvent être absents, incohérents ou partiellement supprimés. |
Droits / Contexte | L’utilisateur doit appartenir au groupe Administrators et lancer la commande depuis %windir%\system32\inetsrv dans une console élevée. |
Diagnostic rapide (checklist exécutable)
Avant toute modification, passez ces vérifications. Elles permettent d’identifier en quelques minutes si le problème est lié aux fonctionnalités, aux droits ou au service IIS.
Action | Commande | Résultat attendu |
---|---|---|
Confirmer l’exécution en console élevée | whoami /groups | findstr /I "Enabled; Mandatory; High" | Jeton élevé actif (ou exécuter Invite de commandes en tant qu’administrateur). |
Vérifier la présence de Request Monitor (Windows Server) | powershell -NoProfile -Command "Get-WindowsFeature Web-Request-Monitor" | Installed doit être True. Sinon, installer la fonctionnalité. |
Vérifier la présence de Request Monitor (Windows 10/11 avec IIS) | dism /online /Get-Features /Format:Table | findstr /I RequestMonitor | La fonctionnalité IIS-RequestMonitor doit apparaître comme Enabled. |
Confirmer le bon exécutable AppCmd (64 bits) | where appcmd | Chemin attendu : C:\Windows\System32\inetsrv\appcmd.exe . |
Vérifier que IIS est en service | sc query w3svc | STATE doit être RUNNING (sinon démarrer : net start w3svc ). |
Tester l’initialisation du Request Monitor | curl -I http://localhost/ | Déclenche une requête de test, nécessaire juste après un redémarrage. |
Solutions et étapes correctives
Vérifier que Request Monitor est installé
GUI (Server Manager)
- Ouvrez Gestionnaire de serveur → Ajouter des rôles et fonctionnalités.
- Serveur Web (IIS) → Health and Diagnostics → cochez Request Monitor.
- Appliquez puis redémarrez le service W3SVC ou exécutez
iisreset
.
PowerShell (Windows Server 2012+)
Install-WindowsFeature Web-Request-Monitor -IncludeManagementTools
Restart-Service W3SVC
DISM (client Windows 10/11 avec IIS)
dism /online /Enable-Feature /FeatureName:IIS-RequestMonitor /All
iisreset
Astuce : selon l’édition, le nom peut être Web-Request-Monitor
(PowerShell/Server) ou IIS-RequestMonitor
(DISM/Client). Après activation, exécutez une requête de test (curl
, navigateur) pour initialiser le composant avant de relancer appcmd list requests
.
Réinstaller ou réparer IIS
Si l’activation de Request Monitor échoue, qu’un rollback se produit, ou que d’autres sous‑composants « Health & Diagnostics » sont manquants, réparez le rôle IIS.
Réparation avec DISM
dism /online /disable-feature /featurename:IIS-WebServerRole
dism /online /enable-feature /featurename:IIS-WebServerRole /all
Ensuite, vérifiez et (ré)activez :
- Health and Diagnostics : HTTP Logging, Logging Tools, Tracing, Request Monitor.
- Les dépendances de vos applications (ASP.NET, WebSockets, etc.).
Alternative PowerShell (Windows Server)
Uninstall-WindowsFeature Web-Server
Install-WindowsFeature Web-Server -IncludeManagementTools
Install-WindowsFeature Web-Request-Monitor
iisreset
Activer la journalisation de suivi des échecs (FREB) comme alternative
FREB (Failed Request Tracing) n’a pas besoin de Request Monitor pour fonctionner et permet d’analyser les requêtes bloquées/lentes en profondeur.
- Dans IIS Manager → sélectionnez le site cible → Failed Request Tracing → Enable.
- Créez une règle de trace : choisissez les codes d’état (par ex. 500–599) et/ou une règle sur la durée (Time-Taken).
- Choisissez les zones à tracer : General Request, ASP.NET, ISAPI, Module, Rewrite, etc.
- Appliquez et reproduisez le problème.
Où lire les traces ?
Par défaut : %SystemDrive%\inetpub\logs\FailedReqLogFiles\W3SVC<ID>\*.xml
. Ces fichiers XML contiennent la séquence des notifications du pipeline, la pile d’appels managée (si activée) et les timings détaillés par étape.
Utiliser l’interface graphique « Current Requests »
Sans AppCmd, l’interface IIS permet de voir les requêtes en direct :
- Dans IIS Manager → Worker Processes.
- Double‑cliquez sur un processus
w3wp.exe
→ Requests. - Triez par Time Elapsed pour identifier les requêtes longues/bloquées.
Cet écran interroge la même instrumentation sous‑jacente. S’il est vide après redémarrage, lancez une requête de test sur le site cible pour déclencher l’initialisation.
Diagnostics avancés (ETW, dumps)
Quand l’erreur persiste après réinstallation ou quand vous devez aller plus loin :
Tracer l’ETW Microsoft‑Windows‑IIS‑RequestMonitor
REM Démarrer une trace ETW en direct
logman start IISReqMon -p "Microsoft-Windows-IIS-RequestMonitor" 0xFFFFFFFF 0x5 -o "%TEMP%\IISReqMon.etl" -ets
REM Reproduire le problème, puis arrêter la trace
logman stop IISReqMon -ets </code></pre>
<p>Analysez le fichier <code>.etl</code> avec <em>Windows Performance Analyzer</em> (WPA) ou un autre outil ETW pour identifier les requêtes, les délais et les modules impliqués.</p>
<h4>Capturer un dump ciblé sur requête lente</h4>
<pre><code>REM Sur un PID w3wp spécifique (exemple PID 1234)
procdump -ma -s 5 -n 3 1234 C:\Dumps\w3wp_slow_"%%datetime%%".dmp
</code></pre>
<p>Le dump mémoire, corrélé aux timestamps FREB/ETW, permet d’identifier des verrous, des blocages réseau ou des appels externes lents.</p>
<h2>Bonnes pratiques et garde‑fous</h2>
<ul>
<li><strong>Toujours exécuter AppCmd depuis <code>%windir%\system32\inetsrv</code></strong> dans une console <em>Run as Administrator</em>. Évitez les copies locales d’AppCmd.</li>
<li><strong>Comparer 32/64 bits</strong> : privilégiez <code>System32</code> (64 bits). Ne lancez pas AppCmd depuis <code>SysWOW64</code> sauf cas particulier.</li>
<li><strong>Redémarrer W3SVC après modification des rôles</strong> : <code>Restart-Service W3SVC</code> ou <code>iisreset</code>.</li>
<li><strong>Initialisation post‑reboot</strong> : juste après un redémarrage, <code>appcmd list requests</code> peut être vide jusqu’à la première requête. Provoquez une requête de test.</li>
<li><strong>Éviter les modifications concurrents</strong> : n’ajoutez/supprimez pas des rôles IIS pendant que des pools d’applications traitent du trafic.</li>
</ul>
<h2>Exemples de commandes utiles</h2>
<p>Filtrer les requêtes actives :</p>
<pre><code>appcmd list requests /state:executing
</code></pre>
<p>Limiter aux requêtes de plus de 10 s :</p>
<pre><code>appcmd list requests /elapsed:10000
</code></pre>
<p>Lister par site ou application pool :</p>
<pre><code>appcmd list requests /site.name:"Default Web Site"
appcmd list requests /apppool.name:"MonPoolApp"
</code></pre>
<p>Afficher toutes les propriétés d’une requête :</p>
<pre><code>appcmd list requests /text:*
</code></pre>
<h2>Procédure pas‑à‑pas recommandée</h2>
<ol>
<li><strong>Confirmez les droits</strong> : session élevée + appartenance au groupe Administrators.</li>
<li><strong>Vérifiez <em>Request Monitor</em></strong> : installez et redémarrez W3SVC si absent.</li>
<li><strong>Testez</strong> : envoyez une requête de test, puis relancez <code>appcmd list requests</code>.</li>
<li><strong>Réparez IIS</strong> si l’activation échoue (DISM/PowerShell, puis validation des sous‑composants Health & Diagnostics).</li>
<li><strong>Mettez en place un plan B</strong> : FREB pour les traces détaillées, ETW pour la corrélation fine, et UI <em>Current Requests</em> en observation live.</li>
</ol>
<h2>FAQ express</h2>
<p><strong>Q : L’erreur « Not implemented » peut‑elle venir d’une faute de syntaxe AppCmd ?</strong><br>
R : Non. <code>0x80004001</code> signifie que la fonctionnalité requise n’est pas implémentée/chargée, pas que la commande est mal formée.</p>
<p><strong>Q : IIS Express est‑il concerné ?</strong><br>
R : <code>appcmd list requests</code> cible IIS (W3SVC). Sur un poste avec IIS Express uniquement, la commande n’exploitera pas Request Monitor.</p>
<p><strong>Q : Pourquoi rien n’apparaît juste après un redémarrage ?</strong><br>
R : Request Monitor doit s’initialiser à la première requête. Exécutez une requête <em>dummy</em> (ex. <code>curl -I http://localhost/</code>), puis relancez la commande.</p>
<p><strong>Q : Faut‑il redémarrer le serveur complet ?</strong><br>
R : Non, en général <code>Restart-Service W3SVC</code> ou <code>iisreset</code> suffit après installation/activation de la fonctionnalité.</p>
<h2>Scripts prêts à l’emploi</h2>
<p><strong>Validation automatique (PowerShell)</strong></p>
<pre><code># Test-IISRequestMonitor.ps1
$feature = Get-Command Get-WindowsFeature -ErrorAction SilentlyContinue
if ($null -ne $feature) {
$rm = Get-WindowsFeature Web-Request-Monitor
if ($rm -and $rm.Installed) {
Write-Host "OK - Web-Request-Monitor est installé." -ForegroundColor Green
} else {
Write-Host "ABSENT - Installez Web-Request-Monitor:" -ForegroundColor Yellow
Write-Host "Install-WindowsFeature Web-Request-Monitor -IncludeManagementTools"
}
} else {
Write-Host "Environnement client (DISM):" -ForegroundColor Yellow
Write-Host "dism /online /Enable-Feature /FeatureName:IIS-RequestMonitor /All"
}
Write-Host "Redémarrez le service W3SVC, puis lancez une requête test et exécutez 'appcmd list requests'."
</code></pre>
<h2>Étude de cas condensée</h2>
<p><strong>Contexte</strong> : migration d’une VM en Windows Server 2019. Les équipes constataient des requêtes ASP.NET intermittentes. <code>appcmd list requests</code> renvoyait « Not implemented ».</p>
<p><strong>Actions</strong> : vérification des rôles » absence de <em>Request Monitor</em>. Installation via PowerShell, <code>iisreset</code>, envoi d’une requête de test. Mise en place de FREB (seuil 5 s) et capture ETW lors de la charge.</p>
<p><strong>Résultat</strong> : <code>appcmd list requests /elapsed:5000</code> a révélé des requêtes bloquées dans un handler custom. Les traces FREB+ETW ont montré un dépassement sur un appel SQL. Correctif appliqué côté connection pooling ; latence résolue.</p>
<h2>Informations complémentaires utiles</h2>
<ul>
<li>Sur Windows Server 2012 et ultérieur, <code>appcmd list requests</code> ne retourne rien tant que <strong>Request Monitor</strong> ne s’est pas initialisé ; exécutez une requête de test après le redémarrage.</li>
<li>Le code <strong>0x80004001 (E_NOTIMPL)</strong> provient uniquement du fait que la fonctionnalité requise n’a pas été compilée/chargée, pas d’un défaut de syntaxe.</li>
<li>Pour filtrer les requêtes actives :
<pre><code>appcmd list requests /state:executing
ou ajouter /elapsed:10000 pour ne lister que celles de plus de 10 s.</li>
Résumé exécutable
Si vous rencontrez « Not implemented » :
- Installez Request Monitor (Server Manager ou commandes ci‑dessus).
- Redémarrez W3SVC ou exécutez
iisreset
. - Effectuez une requête de test, puis relancez
appcmd list requests
. - Si l’erreur persiste, réparez le rôle IIS et activez les sous‑composants Health & Diagnostics.
- En parallèle, activez FREB et, si besoin, une trace ETW pour un diagnostic complet.
Ces démarches rétablissent en général la commande Request Monitor et offrent des solutions de repli si le module n’est pas disponible.