IIS : corriger l’erreur « Not implemented » d’AppCmd list requests (Request Monitor, 0x80004001)

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).

Sommaire

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’erreur 0x80004001 (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

PisteExplications rapides
Fonctionnalité manquanteL’outil AppCmd ne peut lister les requêtes que si la fonctionnalité Request Monitor est installée et chargée.
Installation IIS corrompueDes composants « Health & Diagnostics » peuvent être absents, incohérents ou partiellement supprimés.
Droits / ContexteL’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.

ActionCommandeRésultat attendu
Confirmer l’exécution en console élevéewhoami /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 RequestMonitorLa fonctionnalité IIS-RequestMonitor doit apparaître comme Enabled.
Confirmer le bon exécutable AppCmd (64 bits)where appcmdChemin attendu : C:\Windows\System32\inetsrv\appcmd.exe.
Vérifier que IIS est en servicesc query w3svcSTATE doit être RUNNING (sinon démarrer : net start w3svc).
Tester l’initialisation du Request Monitorcurl -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)

  1. Ouvrez Gestionnaire de serveurAjouter des rôles et fonctionnalités.
  2. Serveur Web (IIS)Health and Diagnostics → cochez Request Monitor.
  3. 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.

  1. Dans IIS Manager → sélectionnez le site cible → Failed Request TracingEnable.
  2. 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).
  3. Choisissez les zones à tracer : General Request, ASP.NET, ISAPI, Module, Rewrite, etc.
  4. 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 :

  1. Dans IIS ManagerWorker Processes.
  2. Double‑cliquez sur un processus w3wp.exeRequests.
  3. 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_&quot;%%datetime%%&quot;.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&nbsp;bits</strong>&nbsp;: privilégiez <code>System32</code> (64&nbsp;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>&nbsp;: <code>Restart-Service W3SVC</code> ou <code>iisreset</code>.</li>
  <li><strong>Initialisation post‑reboot</strong>&nbsp;: 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>&nbsp;: 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&nbsp;:</p>
<pre><code>appcmd list requests /state:executing
</code></pre>
<p>Limiter aux requêtes de plus de 10&nbsp;s&nbsp;:</p>
<pre><code>appcmd list requests /elapsed:10000
</code></pre>
<p>Lister par site ou application pool&nbsp;:</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&nbsp;:</p>
<pre><code>appcmd list requests /text:*
</code></pre>

<h2>Procédure pas‑à‑pas recommandée</h2>
<ol>
  <li><strong>Confirmez les droits</strong>&nbsp;: session élevée + appartenance au groupe Administrators.</li>
  <li><strong>Vérifiez <em>Request&nbsp;Monitor</em></strong>&nbsp;: installez et redémarrez W3SVC si absent.</li>
  <li><strong>Testez</strong>&nbsp;: 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 &amp; Diagnostics).</li>
  <li><strong>Mettez en place un plan B</strong>&nbsp;: 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&nbsp;: L’erreur «&nbsp;Not implemented&nbsp;» peut‑elle venir d’une faute de syntaxe AppCmd&nbsp;?</strong><br>
R&nbsp;: 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&nbsp;: IIS&nbsp;Express est‑il concerné&nbsp;?</strong><br>
R&nbsp;: <code>appcmd list requests</code> cible IIS (W3SVC). Sur un poste avec IIS&nbsp;Express uniquement, la commande n’exploitera pas Request&nbsp;Monitor.</p>
<p><strong>Q&nbsp;: Pourquoi rien n’apparaît juste après un redémarrage&nbsp;?</strong><br>
R&nbsp;: Request&nbsp;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&nbsp;: Faut‑il redémarrer le serveur complet&nbsp;?</strong><br>
R&nbsp;: 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>&nbsp;: migration d’une VM en Windows Server&nbsp;2019. Les équipes constataient des requêtes ASP.NET intermittentes. <code>appcmd list requests</code> renvoyait «&nbsp;Not implemented&nbsp;».</p>
<p><strong>Actions</strong>&nbsp;: vérification des rôles&nbsp;&raquo; absence de <em>Request&nbsp;Monitor</em>. Installation via PowerShell, <code>iisreset</code>, envoi d’une requête de test. Mise en place de FREB (seuil 5&nbsp;s) et capture ETW lors de la charge.</p>
<p><strong>Résultat</strong>&nbsp;: <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&nbsp;; latence résolue.</p>

<h2>Informations complémentaires utiles</h2>
<ul>
  <li>Sur Windows&nbsp;Server&nbsp;2012 et ultérieur, <code>appcmd list requests</code> ne retourne rien tant que <strong>Request&nbsp;Monitor</strong> ne s’est pas initialisé&nbsp;; 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&nbsp;:
    <pre><code>appcmd list requests /state:executing
ou ajouter /elapsed:10000 pour ne lister que celles de plus de 10&nbsp;s.</li>

Résumé exécutable

Si vous rencontrez « Not implemented » :

  1. Installez Request Monitor (Server Manager ou commandes ci‑dessus).
  2. Redémarrez W3SVC ou exécutez iisreset.
  3. Effectuez une requête de test, puis relancez appcmd list requests.
  4. Si l’erreur persiste, réparez le rôle IIS et activez les sous‑composants Health & Diagnostics.
  5. 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.

Sommaire