> Tech > Evaluer la crise

Evaluer la crise

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

IdentifySQLComputers.vbs, que montre le listing 1, s'inspire pour beaucoup de la série de scripts I présentée dans l'article « Administration à  distance avec WMI », Windows & .Net Magazine avril 2003. L'objet de ce script est simple et direct. A partir d'une liste de noms d'ordinateurs que vous aurez stockée

Evaluer la crise

dans un fichier d’entrée de
type texte, le script utilise WMI (Windows
Management Instrumentation)
pour déterminer si SQL Server 2000 ou
MSDE sont installés sur les ordinateurs
cible. Comme IdentifySQLComputers.
vbs utilise WMI, les ordinateurs
cible doivent utiliser WMI pour que le
script fonctionne. Dans Windows 2000
et ultérieurs, WMI est un composant
central de l’OS, donc WMI est déjà  installé
et validé. En revanche, sur des ordinateurs
sous Windows NT 4.0 ou
Windows 98, il faut installer et configurer
WMI pour pouvoir utiliser
IdentifySQLComputers.vbs.
Le fichier d’entrée, Computers.txt,
contient un nom d’ordinateur par
ligne. Pour chaque ordinateur présent
dans le fichier, le script affiche l’un des
trois types de messages suivants :

  • GOOD – indique que ni SQL Server
    2000 ni MSDE ne sont installés sur la
    machine cible.

  • BAD – indique que SQL Server 2000
    ou MSDE est installé sur la machine
    cible.

  • ERROR – indique qu’il n’a pas été
    possible d’atteindre l’ordinateur
    cible. Cause possible : un nom d’ordinateur
    incorrect dans le fichier
    d’entrée, des problèmes de connectivité
    réseau (par exemple, l’ordinateur
    n’a pas répondu à  un ping), ou
    l’ordinateur n’est pas validé pour
    WMI.

Voyons comment fonctionne IdentifySQLComputers.
vbs. Comme on le
voit dans le listing 1, je commence le
script en définissant la constante
ForReading et en initialisant deux variables
: strInputFile et strService-
Name. La valeur de la variable strInputFile
pointe sur le fichier d’entrée
Computers.txt. La valeur de la variable
strServiceName est le nom de service
interne (c’est-à -dire, le nom que l’OS
utilise en interne) du service faisant
l’objet de votre vérification. Dans ce
cas, je veux vérifier les PC pour le service
SQL Server parce qu’il démarre le
SQL Server Resolution Service, lequel
est la cible du ver SQL Slammer. Le
nom de service interne du service SQL
Server est MSSQLSERVER. (Vous pouvez
trouver le nom de service interne
d’un service dans le champ Service
name de la page General Properties du
service dans le snap-in Microsoft
Management Console – MMC – Services.)
Ensuite, j’utilise la méthode Open-
TextFile de FileSystemObject pour ouvrir
Computers.txt. OpenTextFile
renvoie une référence à  un objet Text-
Stream, que j’attribue à  la variable
nommée objTextStream. Pour extraire
le contenu de ce fichier, j’utilise la méthode
ReadAll de l’objet TextStream
pour lire tout le fichier d’entrée en mémoire.
J’appelle ensuite la fonction
Split de VBScript et j’utilise le retour
chariot/saut de ligne (que vbCrLf représente)
du fichier comme délimiteur.
La fonction Split découpe le fichier
en mémoire et renvoie une
matrice contenant les noms des ordinateurs.
J’attribue la matrice à  la variable
array arrComputers puis je
ferme le fichier d’entrée.
Ensuite, je définis une référence
vers le flux StdOut de l’objet WScript.
Ce code est facultatif et je ne l’utilise
que par commodité. En définissant
ainsi une référence, je peux utiliser la
notation StdOut.WriteLine plus courte
au lieu de la notation WScript.
StdOut.WriteLine plus explicite pour
envoyer du texte à  la console. Si vous
utilisez la propriété StdOut, vous devez
exécuter le script avec l’hôte
cscript.exe. Vous ne pouvez pas utiliser
wscript.exe parce qu’il ne comprend
pas les flux STDIO (c’est-à -dire, STDIN,
STDOUT et STDERR).
Après avoir défini la référence vis-à vis
de la variable StdOut, je crée un objet
WshShell. Par la suite, j’utiliserai la
méthode Exec de cet objet pour envoyer
un ping à  chaque ordinateur
avant d’essayer de m’y connecter.
L’utilisation de la méthode Exec met en
évidence une autre dépendance de
script. Microsoft a ajouté la méthode
Exec à  Windows Script Host (WSH) 5.6.
Par conséquent, il faut exécuter le
script sur un ordinateur sur lequel
WSH 5.6 est installé. Windows Server
2003 et Windows XP incluent WSH 5.6
par défaut. Si vous exécutez le script
sur un ordinateur Win2K NT 4.0 ou
Win98, il faut passer au niveau WSH
5.6.
Ensuite, j’utilise une instruction
For Each…Next (aussi appelée boucle
For Each) pour effectuer le gros du travail.
Avant d’entrer dans la boucle, je
valide le mécanisme de traitement
d’erreurs de VBScript : l’instruction On
Error Resume Next. Cette instruction
fait exactement ce qu’elle dit – c’est-à dire,
si le script rencontre une erreur
d’exécution (la partie On Error), le
script continue jusqu’à  l’instruction
suivante (la partie Resume Next) au
lieu d’avorter. L’utilisation de On Error
Resume Next permet d’utiliser l’objet
Err de VBScript pour vérifier et traiter
les erreurs de manière élégante.
La boucle Fort Each se déroule au
travers de la matrice arrComputers que
j’ai créée précédemment. Pour chaque
ordinateur figurant dans le fichier d’entrée,
le script effectue les trois étapes
suivantes :

Etape 1 : Déterminer la disponibilité
de l’ordinateur.

Pour déterminer la
disponibilité de l’ordinateur cible, le script utilise la méthode Exec de l’objet
WshShell pour envoyer un ping à  l’ordinateur,
comme le montre le renvoi A
du listing 1. Exec renvoie une référence
à  un objet WshScriptExec, que le
script utilise pour lire et capturer la
sortie de la commande Ping. J’utilise la
fonction VBScript LCase pour convertir
la sortie de Ping en minuscules et
pour stocker la sortie dans la variable
nommée strPingResults.
Pour évaluer la sortie dans
strPingResults, le script utilise une instruction
If…Then…Else et la fonction
InStr de VBScript. Si la sortie contient
la sous-chaîne reply from, Ping a réussi
et le script passe au code du renvoi B
du listing 1. Si strPingResults ne
contient pas la sous-chaîne reply from,
Ping a échoué et le script saute à  la
clause Else mise en évidence par le
renvoi C du listing 1. Le code de la
clause Else envoie le message d’erreur
[Ping failed] à  la console.

Etape 2 : Se connecter à  l’ordinateur.
Pour se connecter à  WMI sur l’ordinateur
cible, le script utilise la fonction
GetObject de VBScript combinée avec
une chaîne de connexion WMI standard
(aussi appelée moniker), comme
le montre le code du renvoi B.
GetObject renvoie une référence à 
l’objet SWbemServices de la WMI
Scripting Library, qui représente une
connexion authentifiée à  WMI sur un
ordinateur local ou distant. La variable
nommée objWMIService est initialisée
avec la référence SWBemServices que
GetObject renvoie.
En suivant l a tentative de
connexion, le script utilise une seconde
instruction If…Then…Else et la
propriété Number de l’objet Err pour
déterminer si la connexion a réussi. Si
Err.Number est autre chose que zéro,
la connexion WMI a échoué et le script
envoie un message d’erreur approprié
à  la console. Si Err.Number est égal à 
zéro, la connexion a réussi et le script
passe à  la clause Else dans la seconde
instruction If…Then…Else.

Etape 3 : Extraire le service.
Le
script utilise la référence objet
SWBemServices de la WMI Scripting
Library (objWMIService) pour extraire
le service cible. Plus précisément, le
script utilise la méthode Get de l’objet
SWBemServices qui accepte trois paramètres
facultatifs : un chemin d’objet,
quelques flags, et un jeu de valeurs
nommées. Dans ce script, seul le premier
paramètre est nécessaire. Le paramètre
de chemin d’objet que le script
transmet à  Get prend la forme

« Class.Key=’Value' »

où Class fait référence à  la classe WMI
qui modélise la ressource cible. Key est
la propriété de classe qui identifie les
instances uniques de la ressource gérée et ‘Value’ est la valeur qui identifie
de façon unique l’instance de la
ressource que WMI doit extraire. Par
exemple, considérons le chemin
d’objet suivant :

« Win32-Service.name=
‘MSSQLSERVER' »

Win32_service est la classe, Name
est la propriété Key pour la classe
Win32_Service et ‘MSSQLSERVER’ est
l’instance unique de Win32_Service
que Get doit extraire. La seule différence
entre cet exemple de chemin
d’objet et le chemin d’objet dans
IdentifySQLComputers.vbs est que,
dans IdentifySQLComputers.vbs, le
script stocke le nom de l’instance cible
dans la variable strServiceName. Le fait
de stocker l’instance cible dans une variable
facilite l’adaptation du script si
on le destine à  différents services.
Dans ces exemples de chemins
d’objet, vous avez probablement remarqué
que j’ai mis la valeur entre
guillemets simples. Vous devez mettre
la valeur entre guillemets simples ou
doubles. Dans le code VBScript, je préfère
utiliser des guillemets simples
parce qu’ils sont plus faciles à  manipuler.
Ainsi, il n’est pas nécessaire de faire
escape de guillemets simples imbriqués,
comme on le fait pour des guillemets
doubles.
Après l’appel de la méthode Get, le
script utilise une troisième instruction
If…Then…Else et la propriété Number
de l’objet Err pour déterminer l’issue
de la méthode. Si Get échoue, ce qui
est une bonne issue dans le cas présent,
Err.Number aura une valeur nonzéro,
signifiant que le service MSSQLSERVER
n’est pas installé sur
l’ordinateur cible. Si Get réussit, le
service MSSQLSERVER est installé sur
l’ordinateur cible. Dans les deux cas, le
script envoie un message approprié à 
la console.
La figure 1 montre les résultats obtenus
en exécutant IdentifySQLComputers.
vbs dans mon labo. Des sept
ordinateurs figurant dans la sortie, un
seul (mis en évidence) est suspect. Si
je n’avais pas su que les ordinateurs
nommés dellsx260a et wdywtgt étaient
offline et que dellxps est un ordinateur
XP Home Edition qui ne permet pas de
connexions WMI à  distance, il m’aurait
fallu chercher pourquoi ces ordinateurs
signalaient une erreur. Dans ce
cas, les erreurs sont intentionnelles.
Pour utiliser IdentifySQLComputers.
vbs dans votre environnement, il
vous suffit de créer un fichier texte qui
contient la liste des ordinateurs cible
dans votre environnement. Si vous
voulez éviter de modifier le script,
nommez le fichier texte Computers.txt
et sauvegardez-le dans C:\Scripts.
Sinon, il vous faudra changer la valeur
attribuée à  la variable strInputFile.
Je vous pose une question en
prime : Dans un script, pouvez-vous
utiliser AD (Active Directory) comme
source de noms d’ordinateurs au lieu
d’un fichier d’entrée à  base de texte ?
Absolument! Vous seriez peut-être surpris
en voyant la banalité des changements.
Pour en savoir plus sur ces
changements, lisez l’encadré Exclusif
Web « Using AD to Retrieve Computer
Names », sur www.itpro.fr Club Abonnés.

Téléchargez cette ressource

Guide inmac wstore pour l’équipement IT de l’entreprise

Guide inmac wstore pour l’équipement IT de l’entreprise

Découvrez toutes nos actualités à travers des interviews, avis d'experts et témoignages clients et ainsi, retrouvez les dernières tendances et solutions IT autour de nos 4 univers produits : Poste de travail, Affichage et collaboration, Impression et capture et Infrastructure.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010