IIS : Erreur lors de la déclaration de l’identité d’un pool d’application

iisSur un serveur qui fonctionnait parfaitement (c’est à dire que IIS tourne et les sites répondent), je crée un nouveau pool d’application avec un compte d’annuaire comme identité. Et là boom, erreur de type « Données incorrectes » (HRESULT : 0x80090005) :

iis_bad_data

Ou plus sexy en Powershell :

iis_bad_data_ps

Dans un premier temps, on pourrait croire que le mot de passe du compte est erroné. Mais ce n’est pas le cas. Quand cette erreur survient, le serveur a déjà vérifié la validité du compte.

Comment IIS encrypte les mots de passe ?
IIS encrypte les mots de passe en utilisant différents providers qui sont stockées dans le fichier applicationHost.config (%SystemRoot%System32inetsrvconfig), dans la section <configProtectedData>, par exemple :


<add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="*****" />

Le provider « AesProvider » est utilisé pour crypter et décrypter les sections system.webServer.
Le provider « IISWASOnlyRsaProvider » est utilisé pour crypter et décrypter les sections dans le applicationHost.config.

Quant aux clés d’encryption, elles sont dans C:ProgramDataMicrosoftCryptoRSAMachineKeys, et elles sont uniques à chaque serveur !

Conclusion : Cette erreur viendrait du fait que les providers décrits dans applicationHost.config ne correspondent plus aux clés du serveur.

Que s’est-il passé ?
Il y a évidemment plusieurs scénarii qui aboutissent à ce problème, mais le plus simple est le suivant : le fichier applicationHost.config a été écrasé à partir d’une copie d’un autre serveur.

Comment résoudre ?
Il y a plusieurs solutions aussi, plus ou moins douloureuses :
Restaurer le fichier applicationHost.config s’il a été sauvegardé,
Réinstaller le rôle « Serveur web »,
Importer également les clés du serveur d’origine. Cet article explique bien le problème et la manipulation à faire.

Un autre article intéressant explique tout cela en détail : MachineKeys on IIS 7.x : Inside Out.

PERL / Appcmd : Add a mapping element that contains spaces and quotes.

How to encode encoded characters without escaping them ? ^_^

When you try to add a module mapping for perl, it is supposed to be configured like this in IIS :

Request Path : *.pl

Executable : C:Perlinperl.exe « %s » %s

This declaration looks like this in IIS config files (web.config or machine.config) :

<handlers>

<add name="Perl" path="*.pl" verb="GET,HEAD,POST" modules="CgiModule" scriptProcessor="E:Perl64Perl64inperl.exe &quot;%s&quot; %s" />

</handlers>

The double-quotes that surrounds %s are encoded with XML encoding.

But when you use appcmd command to declare this module mapping, it is a bit more tricky, because you cannot use the special character &. Furthermore, the presence of spaces into the « scriptProcessor » attribute force you to surround the whole expression with double-quotes…

So, this is the appcmd command :

appcmd.exe set config /section:handlers /"+[name='Perl',paverb='GET,HEAD,POST',modules='CgiModule',scriptProcessor='E:Perl64Perl64inperl.exe %u0022%s%u0022 %s']"