Windows Server 2008 R2 sur mon MacBook Air!

Ce post fait suite à mon billet précédent « J’ai un Mac…C’est grave docteur ?« .
J’avais installé Windows 7 RC, qui marchait très bien. Cependant, j’avais besoin de faire tourner un Windows Server 2008 R2 avec hyper-V.
Ce dernier ne peut pas être exécuté dans une VM. J’ai donc décidé d’installer Windows Server 2008 R2 sur mon MacBook Air.
La procédure est simple mais il y a un évènement à ne surtout pas rater… here we go:

  • Copier le dossier Bootcamp du DVD MacOS X sur une clé USB, ceci va être critique pour plus tard !
  • démarrer sous MacOS X. Dégager la partition Windows, et en créer une nouvelle (via le menu BootCamp).
  • démarrer sur le DVD Windows Server 2008 R2. Faire le setup de manière classique.
  • au premier boot de Windows, il faut installer les pilotes bootcamp (le msi directement) sur le champ.
    Si vous redémarrer sans le faire, vous ne pourrez pas faire ctrl + alt + supr, et donc ouvrir une session.
    J’ai dû brancher un clavier usb pour pouvoir le faire!

Il ne reste plus ensuite qu’à redonner l’apparence d’un poste de travail à Windows Server 2008 R2, via powershell:

import-module servermanager
Add-WindowsFeature Desktop-Experience
Add-WindowsFeature Wireless-Networking
Add-WindowsFeature Net-Framework
Add-WindowsFeature Telnet-Client
Set-Service -name Themes -startuptype Automatic
shutdown /r /t 15 /c "reboot pour prise en compte du service themes"

Il ne reste plus qu’à activer le thème Windows 7 pour retrouver Aero.

L’installation d’Hyper-V bloque la mise en veille du portable:
Sleep and hibernate power features are not available when you enable Hyper-V technology on a Windows Server 2008-based portable computer

J’ai donc crée un boot par défaut sans hyper-V via bcdedit:

bcdedit /copy {current} /d "Microsoft Windows Server 2008 - sans hypervisor"
bcdedit /set {identifiant de la commande précédente} hypervisorlaunchtype off /default

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

Windows Server 2008 R2 Core: windows update récalcitrant!

en voulant configurer un Windows Server 2008 R2 afin de télécharger les mises à jour, j’ai eu droit au message d’erreur suivant:

cscript c:\windows\system32\scregedit.wsf /AU 4
Scregedit.wsf(777, 3) (null): 0x80240037

un procmon plus tard, j’ai supprimé la clé suivante (pour le moins « étrange », le serveur étant en workgroup):

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate

Et voilà !

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!

CNAM + Paybox != sécurité ?

ma femme s’inscrivant au Cnam, me demande confirmation avant de rentrer sa carte bleue:

  • Le site est bien en https
  • Le domaine est paybox, très utilisé par les sites marchands
  • Le certificat est de type Extended SSL, Internet Explorer a mis le fond vert dans la barre d’adresse

Je donne donc mon feu vert…30 secondes plus tard, une belle erreur SQL pas gérée du tout:

cnam - paybox - erreur SQL

Pour une école, donnant notamment des cours informatique, cela me parait très léger:

  • Ils ne devraient utiliser que des procédures stockées
  • L’erreur n’apprend rien au client (il est censé prendre des cours d’informatique au mieux…)
  • Elle apprend par contre à un pirate que le code du site a des faiblesses, et qu’il y a sûrement moyen de faire des injections SQL.

La seule bonne nouvelle, c’est que Paybox ne renvoi que le début de la carte bleue au site du cnam, qui n’affiche donc qu’une information partielle.

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