Au cours d'un incident, nous avions un lock qui générait une erreur 500 alors que personne ne semblait détenir ce lock. Pour investiguer ce problème il nous a fallu automatiser la génération d'un log Handle sur un fichier spécifique. En théorie, cela est fort simple. Le lock provocant une erreur 500, je n'avais qu'à me baser sur l'article suivant pour exécuter l'utilitaire Handle.exe lorsqu'une erreur 500 est remontée :
http://blogs.msdn.com/b/friis/archive/2010/05/07/utiliser-freb-pour-g-n-rer-un-dump-sur-une-requ-te-longue-en-ex-cution.aspx
En pratique, cela est bien plus complexe qu'il n'y parait… Voici la marche à suivre détaillée :

Positionnement de "Handle.exe" et des scripts nécessaires à la génération du log Handle :

A la fin de cet article, vous trouverez une archive nommée "handle.zip"
Décompressez l'archive. Vous obtenez un dossier Handle à positionner sur "C:\"

 

Configurer une règle FREB sur le site impacté pour générer une trace sur des erreurs 500 :

Pour ce faire, vous pouvez suivre le plan d'action fourni à l'adresse suivante :
http://blogs.msdn.com/b/friis/archive/2010/04/29/le-fonctionnement-de-freb-ou-comment-investiguer-une-erreur-http-sous-iis-7-7-5.aspx

Après cette étape, le fichier Web.config de votre site devrait contenir les éléments suivants :

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <tracing>
            <traceFailedRequests>
                <add path="*">
                    <traceAreas>
                        <add provider="ASP" verbosity="Verbose" />
                        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
                        <add provider="ISAPI Extension" verbosity="Verbose" />
                        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI" verbosity="Verbose" />
                    </traceAreas>
                    <failureDefinitions statusCodes="500" />
                </add>
            </traceFailedRequests>
        </tracing>
    </system.webServer>
</configuration>

    

Configurer l'ApplicationHost.config pour l'autoriser à exécuter un script à la place d'une trace FREB :

Ouvrez une invite de commande CMD en tant qu'administrateur et naviguez vers le répertoire "C:\Windows\System32\inetsrv"
Exécutez la commande suivante :

appcmd.exe set config -section:system.applicationHost/sites "/[name='NomDeVotreSite'].traceFailedRequestsLogging.customActionsEnabled:"true"" /commit:apphost

Remarque : Pensez à remplacer NomDeVotreSite dans "/[name='NomDeVotreSite'] par le nom réel du site qui est impacté.

   

   

Modifier le fichier Web.config de votre site afin d'indiquer à IIS quel script exécuter à la place de la trace FREB :

Ouvrez le fichier Web.config et remplacez la section <add path="*"> par la ligne suivante :

                <add path="*" customActionExe="c:\windows\system32\cscript.exe" customActionParams="C:\handle\handlefreb.vbs" customActionTriggerLimit="50">

    

 

Changez l'identité de l'application pool à "Local System" :

Pour que le script puisse fonctionner, il faut que l'application pool tourne avec un compte ayant des privilèges élevés. Nous allons donc configurer l'application pool pour utiliser le compte "Local System" qui remplira parfaitement ce rôle. Je vous recommande toutefois de tester cette modification avant de la mettre en place sur un serveur de production.

 

Ajustez les droits de ce compte :

Pour permettre au compte "Local System" d'exécuter Handle.exe il faut lui donner les droits de chargement et déchargement des pilotes de périphériques.
Pour ce faire :
Ouvrez la MMC correspondant à la "Stratégie de sécurité locale" en passant via les outils d'administration
Sous "Stratégies locales > Attribution des droits utilisateur" ajoutez le compte "Local System" à la stratégie "Charger et décharger les pilotes de périphériques"

  

Testez la génération de la trace Handle

Pour tester le bon fonctionnement de la règle et de la génération du log Handle, vous pouvez ouvrir le fichier Web.config et modifier la ligne <failureDefinitions statusCodes="500" /> par <failureDefinitions statusCodes="100-500" />. Ceci vous permettra de générer un log quelque soit le code retour HTTP. Un log devrait alors apparaitre dans le répertoire C:\Handle portant comme nom la date et l'heure correspondant au moment de la génération du log.  Si cela ne fonctionne pas, n'hésitez pas à exécuter un IISRESET et à refaire le test. Pensez à remettre la valeur normale après avoir testé la génération du script.

 

 

Modifiez le script "handlefreb.bat"

Ce script génère actuellement un log handle sur le répertoire "C:\handle".
Il va donc nous falloir le modifier pour générer la trace handle sur le bon répertoire
Pour ce faire :
Ouvrez le script avec notepad et allez à la dernière ligne qui devrait être la suivante :

c:\Handle\handle.exe -a -u -accepteula "C:\handle" > c:\handle\%_date%_%_time%.log

Modifiez la partie en jaune ci-dessus par le répertoire que vous souhaitez surveiller

Les fichiers seront générés dans le répertoire C:\Handle pour des raisons de simplicité.

 

En espérant que cet article vous sera utile.
Sylvain Lecerf & L'équipe du Support IIS Microsoft France