IIS 7 : SSL sur Server Core, Browsing de répertoire virtuel

Voici quelques infos utiles sur IIS 7…

Administrer IIS7 depuis Vista

Il faut :

  • Télécharger la console sur iis.net (qui appartient à Microsoft, équipe produit IIS): http://www.iis.net/expand/IISManager
  • Installer la gestion à distance sur le serveur: start /w ocsetup IIS-ManagementService
  • Passer la clé de registre EnableRemoteManagement à 1 (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server) sur le serveur pour autoriser la gestion à distance
  • Démarrer le service de gestion Web: net start wmsvc

Il ne reste plus qu’à lancer l’interface de gestion depuis Vista et se connecter

Importer un certificat SSL

La console mmc des certificats ne permet pas d’importer un certificat sur un hôte distant. Quand il s’agit d’un server Core, il faut passer en ligne de commande:

certutil -addstore MY moncertificat.pfx

MY correspondant au magasin personnel de l’ordinateur.

Browsing de répertoire virtuel

La configuration était pas tout à fait standard. Plusieurs sites sont déclarés sur IIS, et il y a un site « central » qui dont des répertoires virtuels pointent sur ces sites en webdav, pour les mettre à jour.

Un changement surprenant au départ est que la configuration entre le site et le sous répertoire virtuel est partiellement partagée. Une modification sur l’un impacte l’autre, au moins pour les pages par défaut si les deux sont local et non hérité/local !

J’ai dû laisser la configuration des pages par défaut héritée sur le site, et locale sur le répertoire virtuelle (ce cas là fonctionne). Bien que .Net soit désactivé sur le site « central », IIS essayait d’exécuter default.aspx dans le répertoire virtuelle sans succès, renvoyant un 404 (pratique pour diagnostiquer!). J’ai résolu le problème en vidant le menu des pages par défaut sur les répertoires virtuels.

Tutoriel lotp: VMware Workstation – Windows Server 2008R2 en cluster

Je viens de faire un tutoriel sur la mise en oeuvre d’un cluster Windows Server 2008 R2 dans VMware Workstation.
La partie sensible est la réservation persistante scsi-3 impérative depuis Windows Server 2008.

J’ai poste le tutoriel sur screencast: http://www.screencast.com/t/R7ndyktfNXk
vmware workstation 2008R2 cluster

pour les adeptes de Youtube, je l’ai posté aussi (mais qualité inférieure):

Est-ce que vos serveurs/stations sont sous garantie ?

Il y a certains contextes où l’on ne dispose pas de cette information. Le parc en question est composé de serveurs Dell et HP. Ces deux fabricants proposent de vérifier cette information sans problème, mais seulement de façon unitaire (par 10 pour HP, mais pour un même numéro de produit). Un appel au support Gold donne le même résultat pour les deux, ils ne proposent pas d’autres moyens, et le support eux mêmes utilisent ces pages.

Pour Dell: http://support.euro.dell.com/support/topics/topic.aspx/emea/shared/support/my_systems_info/fr/details?c=fr&l=fr&s=gen
Pour HP: http://www13.itrc.hp.com/service/ewarranty/warrantyResults.do

Quand on a quelques serveurs ou stations, cela ne pose pas de problème. Mais quand il s’agit de vérifier 230 machines, cela se complique!

1/Récupérer les numéros de série des serveurs/stations

La première étape consiste à avoir la liste des machines où récupérer le numéro de série, par exemple depuis l’active directory avec Adfind.
J’ai crée le vbscript suivant, qui prend en argument un nom de serveur, et renvoi une ligne formatée pour un CSV, avec plusieurs informations dont l’asset tag HP ou Dell. Par exemple:

ServeurA;Dell Computer Corporation;PowerEdge 1850;SerialIci;;2;x86 Family 15 Model 4 Stepping 1;3220455424;
ServeurB;HP;ProLiant DL360 G5;SerialIci;;4;x86 Family 6 Model 23 Stepping 10;3487408128;

Le code VBScript:

-------------------------------------------------------------------------------------
Dim hostname,manufacturer,model,serial,assettag
Set objArgs = WScript.Arguments
strComputer = objArgs(0) 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colSettings = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
For Each objComputer in colSettings
 hostname= objComputer.Name
 manufacturer=objComputer.Manufacturer
 model=objComputer.Model
 memory= objComputer.TotalPhysicalMemory
 cpucount= objComputer.NumberOfProcessors
Next
Set colSettings = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_Processor")
For Each objProcessor in colSettings
 cputype=objProcessor.Description
Next
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_BIOS",,48) 
For Each objItem in colItems 
serial=objItem.SerialNumber
Next
wscript.echo hostname & ";" & manufacturer & ";" & model & ";" & serial & ";" & assettag & ";" & cpucount & ";" & cputype & ";" & memory & ";"
-------------------------------------------------------------------------------------

Il reste ensuite a appeler ce script par machine:

for /f %s in (serveurs.txt) do cscript //NOLOGO serial.vbs %s >> serveurs.csv

2/Vérifier les garanties

On a donc maintenant un fichier CSV avec notamment le fameux serial par machine. Le reste va devenir un peu plus « artisanal », car on va:

  • Construire l’URL a appelé pour chacun des fabricants (avec le numéro de série en paramètre)
  • Récupérer la page Web (résultat de la recherche) en html avec wget. (Une page html par machine, le fichier ayant comme nom le numéro de série)
  • Parser les pages pour récupérer uniquement la date d’achat et fin de garantie.

Les étapes unitaires ne sont pas techniquement compliquée, mais nécessite un peu de temps. Plus on a de machines à vérifier, plus cela devient intéressant en terme de temps. D’autre part, on progresse toujours plus en prenant ce chemin qu’en faisant la même tâche 230 fois…

A/Construire les adresses

Une fois le fichier excel importé, on va utiliser les fonctions Excel (en anglais) pour créer l’url des pages. Cela suppose que les numéros de séries sont dans la colonne E.

Pour Dell:

=CONCATENATE("wget -F -O ";E3;" ""http://support.euro.dell.com/support/topics/topic.aspx/emea/shared/support/my_systems_info/fr/details?c=fr&l=fr&s=gen&~ck=anavml&servicetag=";E3;"""")

Le résultat est de la forme:

wget -F -O YYYYY "http://support.euro.dell.com/support/topics/topic.aspx/emea/shared/support/my_systems_info/fr/details?c=fr&l=fr&s=gen&~ck=anavml&servicetag=YYYYYY"

Pour HP:

=CONCATENATE("wget -F -O ";E3;" --post-data=""BODServiceID=NA&RegisteredPurchaseDate=&country=FR&productNumber=AAAAAA-AA&serialNumber2=&serialNumber3=&serialNumber4=&serialNumber5=&serialNumber6=&serialNumber7=&serialNumber8=&serialNumber9=&serialNumber10=&x=31&y=12&serialNumber1=";E3;"""";" http://www13.itrc.hp.com/service/ewarranty/warrantyResults.do")

Il faut remplacer AAAAAA-AA par le product part.

Le résultat est de la forme:

wget -F -O YYYYYY --post-data="BODServiceID=NA&RegisteredPurchaseDate=&country=FR&productNumber=AAAAAA-AA&serialNumber2=&serialNumber3=&serialNumber4=&serialNumber5=&serialNumber6=&serialNumber7=&serialNumber8=&serialNumber9=&serialNumber10=&x=31&y=12&serialNumber1=YYYYYYYY"http://www13.itrc.hp.com/service/ewarranty/warrantyResults.do

B/Récupérer les pages Web

Il suffit de copier/coller le résultat des concaténations dans un .bat. Wget pour Windows est téléchargeable ici par exemple.

Le répertoire courant du .bat se rempli de fichiers portant comme nom chaque numéro de série.

Vous devez d’abord faire tous les Dell puis tous les HP afin de séparer les fichiers.

C/Parser les pages Web

J’ai commencé l’informatique sur Unix/Linux. Pour se qui est de parser des fichiers textes, j’ai gardé mes habitudes sed/awk/grep. Pour faire cela, j’utilise Cygwin sur Windows, qui est gratuit.

Parser les pages HTML pour Dell:

for serial in $(ls -1);do
achat=`cat $serial | awk '{FS="</table>";print $2}' | awk '{FS="<td";print $7}' | grep class | cut -d'>' -f2 | cut -d'<' -f1`
garantie=`cat $serial | awk '{FS="contract_oddrow\">";print $5}' | cut -d'<' -f1 | grep "/"`
echo "$serial ; $achat ; $garantie" >>dell_output.csv
done

Parser les pages HTML pour HP:

for serial in $(ls -1);do
achat=`cat $serial | sed "s/[\t]//g" | grep '^[0-9]\{2\}' | head -1`
garantie=`cat $serial | sed "s/[\t]//g" | grep '^[0-9]\{2\}' | head -2 | tail -1`
echo "$serial ; $achat ; $garantie" >> hp_output.txt
done

Il ne reste plus qu’à faire le rapprochement via les numéros de séries dans Excel 🙂

Tips and tricks du moment

Voici quelques commandes que j’ai utilisé cette semaine…Puisque cela m’a aidé, peut être que cela vous aidera aussi !

Besoin: connaître les utilisateurs qui n’utilisent pas le mode mise en cache de outlook.
Solution: Exchange 2007 possède un cmdlet PowerShell qui correspond tout à fait:

Get-LogonStatistics -server MonServeurExchange | where {$_.ClientMode -eq "Classic"} |FL ClientName

Besoin: Collecter les adresses IP assignées aux serveurs.
Solution:

  • Créer un fichier texte contenant un nom de serveur par ligne, par exemple en récupérant tous les objets AD ayant pour OS « Windows Servers » via adfind
  • Utiliser PowerShell + psexec pour récupérer le résultat de ipconfig /all sur chaque serveur

Le « script » powershell est le suivant:

———————————————————————————————-

get-content servers.txt | foreach-object {
$server=$_
$ip=.\psexec \\$server ipconfig /all| where { $_ -match "IP Address"} | %{$_  -replace "IP Address. . . . . . . . . . . . : ","$server;"}
Write-Output $ip >> servers_ipconfig.txt
}
———————————————————————————————-
Cette méthode, bien que très basique a certains avantages:
  • On récupère les informations en « live » sans reposer sur des relevés pouvant être obsolètes
  • Tout es ramassé, IP via NLB, carte réseau privée (heartbeat…), ip d’un tunnel VPN…
  • psexec permet de spécifier un login/pass quand on est hors domaine
  • Elle ne nécessite aucun agent sur les serveurs (SCCM, Altiris…)
Elle a au moins un inconvénient, il faut adapter la chaîne  de caractère « IP Address » à la langue de vos systèmes d’exploitation.
Si vous êtes allergiques à PowerShell, où qu’il n’est pas disponible depuis votre environnement, une variante en MSDOS:
for /f %s in (servers.txt) do echo %s >>ipall.txt && psexec \\%s ipconfig /all | findstr "Address" | findstr "IP" >> ipall.txt

Lenteurs SharePoint 2007

J’ai été récemment confronté par deux fois à d’importantes lenteurs sous SharePoint 2007:

  • Lors du premier appel suite à recyclage de l’application pool: 2 minutes pour avoir la page
  • Lors de la recherche d’une personne dans l’AD : au moins 30 secondes

2 minutes lors du premier appel

IIS essaye de contacter crl.microsoft.com en http, mais n’y arrive pas. Ceci afin de vérifier la signature des assembly dans le GAC .Net. Les symptômes ainsi que des solutions sont proposées sur ce blog:

http://www.muhimbi.com/blog/2009/04/new-approach-to-solve-sharepoints.html

J’ai choisi la méthode suivante:

Et voilà, on passe à environ 20 secondes, ce qui est « normal » dans la mesure où il doit compiler. Vous pouvez aller encore plus loin en:

  • changeant l’heure par défaut de recyclage de l’application pool
  • Utiliser SPWakeUp, pour « chauffer » le moteur SharePoint en appelant chaque site

Recherche dans l’AD : au moins 30 secondes

Symptômes: vous essayez d’autoriser un utilisateur, un groupe, ou juste assigner une tâche à quelqu’un, cela prends au moins 30 secondes au lieu d’une seconde en général. Je parle ici du temps entre le moment où l’on clique sur la recherche et le moment où le nom est souligné (donc validé).

Analyse du problème: dans mon cas, en traçant l’activité réseau du serveur, on se rend compte qu’il essaye de contacter en vain des contrôleurs de domaines d’une autre forêt en vain au même moment à plusieurs reprise. Cette tentative de connexion est dûe à l’ajout d’une autre forêt via stsadm pour la propriété peoplepicker. Par défaut, SharePoint ne cherche des utilisateurs que dans le domaine où il est. Pour étendre la recherche à d’autre domaines/forêt, il faut les ajouter avec cette commande:
stsadm -o setproperty -url http://SharePointSite:85 -pn peoplepicker-searchadforests –pv “domain1.com”,<loginname1>,<password1>;”domain2.com”,<loginname2>,<password2>

S’il y a une relation d’approbation entre les forêts, il n’y a pas besoin de spécifier un login et un mot de passe.

Voici un post plus détaillé sur le sujet: http://www.gk.id.au/2009/04/people-picker-sharepoint-and-forest.html

Solution: Autoriser les serveurs SharePoint à se connecter aux contrôleurs de domaines de la forêt ciblée. Le port à ouvrir est ldap (389) à la fois en TCP et UDP.

Et voilà, la recherche prend de nouveau environ une seconde et on peut maintenant aussi chercher des utilisateurs de l’autre forêt!

MDM 2008: plus complexe que de prime abord

Comme de plus en plus de produits Microsoft (et autres éditeurs), les solutions tendent à être de plus en plus complexe. Il a beau faire partie de la gamme « System Center » de Microsoft, il quelques singularités auxquelles je me suis frotté récemment. Installé avant mon arrivé, on a souhaité déplacer les bases de données associées au produit d’un serveur SQL à un autre.

1er challenge: où est stocké le nom du serveur SQL ?

Recherche dans la base de registre (comme SCOM) ? rien
Recherche dans les fichiers dans le répertoire d’installation ? rien
Il stocke l’information dans Active Directory (un SCP / Service Connection Point). Un petit coup d’adsiedit plus tard, il pointe sur le nouveau serveur SQL
Ce point est évoqué dans un article Technet lors de la restauration des bases

2ème challenge: SQL

L’équipe du produit utilise pleinement SQL Server, notamment:

  • L’encryption des données via la clé de l’instance (Service Master Key)
  • Job via l’agent SQL

Cela me semble assez « riche » pour ce type de solutions, mais bon… Vous l’avez compris, il faut sauvegarder et restaurer la clé d’encryption de l’instance de l’ancien serveur SQL…

Pour rappel, les bases SQL pour MDM portent les noms suivants:

  • AdminServices
  • MobileEnrollment
  • TEEDB
  • SUSDB

La documentation Microsoft du produit: http://technet.microsoft.com/en-us/scmdm/cc304592.aspx

Réinitialiser le mot de passe admin de domaine sur un DC Windows 2008 avec seulement le DVD d’installation

Bon, tout est dans le titre 🙂

Je n’ai pas utilisé mes VM de labo pendant quelque temps juste après les avoir installées..Et voilà que je ne me rappel plus du mot de passe administrateur du domaine… Plutôt que de réinstaller, j’ai trouvé un hack pour Vista , que j’ai réutilisé pour mon DC Windows Server 2008 ! J’ai juste poussé un peu plus loin en utilisant le DVD officiel d’installation de Windows Server 2008 au lieu de backtrack 🙂

Pour les allergiques ou trop pressé pour regarder la vidéo pas à pas, voici ce qu’il faut faire:

  • Démarrer sur le DVD d’installation de Windows Server 2008
  • Choisir « Réparer votre ordinateur »
  • Lancer une cmd
  • Aller dans c:\windows\system32
  • renommer Utilman.exe en Utilman.exe.bak
  • Copier cmd.exe en Utilman.exe
  • redémarrer sur Windows
  • Faire le raccourci clavier Windows + U devant la fenêtre de logon (lance normalement utilman.exe et donc là cmd.exe)
  • net user administrateur Nouveaumotdepasse123
  • Se logguer avec le compte administrateur du domaine
  • changer le mot de passe 😉
  • Redémarrer sur le DVD pour remettre le fichier original Utilman.exe

OpsMgr/Scom: erreur 2130771918 sur tous les ports TCP et applications Web

Suite à l’installation avec erreurs d’un hotfix Microsoft Scom, les supervisions de type TCP Port et Application Web ne fonctionnaient plus, avec toujours le même code d’erreur 2130771918. Par exemple le test du port scom 5723 sur lui même échouait:

erreur scom sur n'importe quel port TCP
erreur scom sur n'importe quel port TCP

Après l’ouverture d’un ticket au support MS, ils nous ont fourni le patch de la KB 957511. Cette KB ne concerne pas notre problème, mais elle contient une version supérieure de la DLL Momnetworkmodules.dll, qui fait les tests TCP et application Web. Une fois cette DLL mise à jour, le problème est résolu.

Par ailleurs, il aurait pu être nécessaire d’enregistrer de nouveau la DLL avec:

regsvr32 « c:\program files\system center operations manager 2007\momnetworkmodules.dll »

Database Tuning Engine Advisor

Je viens d’apprendre deux choses avec le MS SQL 2005 Database Tuning Engine Advisor à mes dépends.
Je vais donc les partager avec vous afin que cela ne vous arrive pas! Le contexte: Je ne m’occupe pas en général de SQL 2005 (ou m’occupais pas jusqu’à présent). Ayant un problème de perf important sur une de nos futures applications, j’ai utilisé SQL Profiler pour capturer l’activité, et j’ai voulu ensuite utiliser DTA pour savoir s’il manquait des index. Mais je suis allé trop vite, et je n’ai donc pas compris que DTA ne pouvait pas utiliser la trace.

Lorsque vous donnez un fichier trace à DTA, vous pouvez lui spécifier la base de workload, et la ou les bases à optimiser. Je pensais bien faire en sélectionnant la base « tune » comme base de workload. J’ai bien vu quelques erreur après l’analyse sur des requêtes, mais rien n’indiquait un problème majeur:

[Microsoft][SQL Native Client][SQL Server]Could not find stored procedure  XX.P_TM_XXXXXXXXXXXXXXXX’.

Ce message est dû au fait que la trace ne contient pas de « use my_database » avant l’appel aux procédures stockées. DTA ne trouve donc aucune procédure stockée, et n’analyse donc rien les concernants. Ca m’étonnait qu’il ne trouve aucun index ni stats à créer, mais je ne savais pas l’expliquer. Pour palier à cela, il faut donc choisir la base où sont ces procédures stockées ou jouées les requêtes en tant que base de workload.

Une fois ce message d’erreur passé, j’en ai eu un deuxième,car les problèmes viennent toujours à plusieurs:

[Microsoft][SQL Native Client][SQL Server]SHOWPLAN permission denied in database ‘XXXXX’.

Celui-là est un peu différent. Si la trace contient la colonne LoginName ou NTUserName, DTA rejoue les requêtes avec ce ou ces comptes, qui doivent donc avoir les droits de faire un showplan. Pour palier à ce problème sans donner ce droit, vous pouvez ouvrir la trace, supprimer ces colonnes, et enregistrer la trace sous un autre nom, le temps de jouer DTA. Ainsi il utilisera le compte avec lequel vous l’exécuter pour analyser les requêtes 🙂

Et voilà, maintenant il me propose l’ajout de 50 index, 125 statistiques pour une estimation de +50% en perf!!