Windows Script Host

Transcription

Windows Script Host
Windows Script Host - Programmation à l’aide de VBScript
Windows Script Host
Administration à l’aide de VBScript
Martin Descôteaux
mct, mcad, mcsd, mcdba, mcsa, mcdst, ciw
i
ii
Windows Script Host - Programmation à l’aide de VBScript
Table des matières
1- Introduction à Windows Script Host
1
Description et applications de Windows Script Host
2
Architecture de Windows Script Host
Hôtes
Moteurs de scripts
Moteur d’objets
3
3
3
4
Création et exécution des scripts
Création d’un script à l’aide de Bloc-notes
Exécution d’un script à l’invite de commande
5
5
5
Utilisation du débogueur
7
2 – Le langage VBScript
9
Règles fondamentales
10
L’utilisation de variables
La déclaration de variables
Déclaration et utilisation de constantes
Utilisation de constantes existantes
Types de données et conversion explicite
11
12
14
14
15
Les opérateurs
Opérateurs arithmétiques
Opérateur de concaténation
Opérateurs de comparaison
Opérateurs logiques
Priorité des opérateurs
16
16
16
17
17
19
Structures de contrôles et conditions
La structure de branchement If…Else…End If
La structure de branchement Select Case…End Select
Structures répétitives Do While/Until … Loop
Structures répétitives Do … Loop While/Until
Structure répétitive For… Next
Structure répétitive For Each… Next
Structure répétitive While… Wend
Focus sur la condition
Imbrication de structures de contrôle
20
20
22
23
24
25
26
26
27
28
iii
Windows Script Host - Programmation à l’aide de VBScript
Utilisation des fonctions
Création de fonctions et procédures
Procédures
Fonctions
Portée des variables
Passage de paramètres
29
30
31
32
33
34
Utilisation des tableaux
Déclaration et utilisation de tableaux
35
36
Objets, propriétés et méthodes
Objets
Méthodes
Propriétés
38
38
39
40
Création et destruction des objets
Création d’un objet
Destruction d’un objet
Utilisation d’un objet existant
42
42
43
43
Gestion des erreurs
L’instruction On Error Resume Next
L’objet Err
L’instruction On Error Goto 0
44
44
45
46
3 – Les fonctions VBScript
47
Fonctions d’interactivité avec l’utilisateur
48
Fonctions de date et de temps
51
Fonctions de manipulation des chaînes de caractères
53
Fonctions mathématiques
Fonctions mathématiques dérivées
56
57
Fonctions de manipulation des types de données
58
Fonctions de gestion des paramètres régionaux du système
59
Fonctions de contrôle du script et de son exécution
60
iv
Windows Script Host - Programmation à l’aide de VBScript
4 – Modèles d’objets Windows Script Host
61
Les objets WScript
L’objet WScript
La méthode WScript.CreateObject
L’objet WshArguments
Les objets WshNamed et WshUnamed
L’objet WshNetwork
L’objet WshShell
Création de raccourcis
Manipulation de la base de registres
Gestion des variables d’environnement
63
64
66
68
69
71
73
75
77
80
Les objets Scripting
L’objet FileSystemObject
L’objet Drive
L’objet Folder
Manipulation des attributs
L’objet File
L’objet TextStream
82
82
85
87
88
91
92
5 – Techniques avancées de Script
97
Piloter le pare-feu de Windows XP SP2
Activer et désactiver le pare-feu de Windows XP SP2
Autoriser et enlever des applications
Autoriser et enlever des ports
99
101
102
104
Piloter des formulaires Html
Lecture et écriture des valeurs des éléments du formulaire
Spécifier les attributs d’affichage du formulaire Html
Accéder aux variables définies au sein de la page Html
106
108
109
110
Possibilités de WScript.Run
Planifier l’exécution d’un script
Piloter l’affichage du panneau de configuration
Accéder à l’API de Windows à l’aide de RunDll32.exe
114
114
115
116
Thèmes de programmation divers
Envoyer des courriers électroniques simples avec CDONTS
Manipuler une base de registres à distance
Récupérer les configurations matérielles d’un poste avec WMI
117
117
120
123
6 – Environnement d’exécution des scripts
133
Créer des scripts de démarrage
134
Sécuriser l’exécution des scripts
Désactivation de l’exécution automatique des scripts
Désactivation de l’autorisation d’exécuter des scripts
136
136
138
Bibliographie
140
Windows Script Host - Programmation à l’aide de VBScript
Note à propos des symboles et notations utilisées
Voici une description des symboles et notations spéciales utilisées au sein de cette ouvrage :
Objet
Utilisé au sein du texte normal, indique le nom d’une variable, d’une fonction
ou d’un objet.
Code
Indique un bloc de code qui doit être tapé à l’intérieur de l’éditeur de texte.
Utilisé au sein d’un bloc de code, indique que le code se continue sur la ligne
suivante au sein du document seulement puisque la largeur de la feuille de
papier en restreint l’inscription sur une seule et même ligne.
Indique une note spéciale.
L’ensemble des impressions d’écrans contenues dans ce volume ont été réalisées sous un environnement Microsoft
Windows 2000 ou Windows XP. Celles-ci pourraient varier légèrement de vos écrans si vous utilisez un système
d’exploitation différent.
v
1. Introduction à Windows Script Host
1
1
Introduction à Windows Script Host
DescoDev
1. Introduction à Windows Script Host
2
1. Introduction à Windows Script Host
Windows Script Host (WSH) est un environnement permettant d’héberger et d’exécuter des
scripts afin d’automatiser des tâches administratives sur l’ordinateur. Avant Windows 98, aucun
outil n’existait pour accomplir de telles tâches si ce n’est que le Macro Recorder de Windows 3.1
et les fichiers Batch (*.bat) typiques à DOS. Cependant, ces derniers possédaient de fortes
limitations tant qu’au niveau de la structure du langage qu’au niveau des fonctionnalités
accessibles.
Description et applications de Windows Script Host
Lorsqu’un script s’exécute sur votre ordinateur, WSH joue le rôle de l’hôte en lui rendant
accessibles une pluralité d’objets et de services ainsi qu’une série de règles au sein desquelles le
script est exécuté. De plus, Windows Script Host gère l’aspect sécurité entourant l’exécution d’un
script et invoque le moteur de script approprié.
Windows Script Host est l’idéal pour l’administrateur qui désire créer des scripts comme des
scripts de connexion et d’administration automatisée. WSH vous permet d’accomplir des tâches
comme :
•
•
•
•
•
•
•
•
•
•
Imprimer des messages à l’écran
Exécuter des fonctions de base
Créer des icônes, démarrer des logiciels
Effectuer des sauvegardes (backup)
Connecter des lecteurs réseau
Connecter des imprimantes
Récupérer ou modifier des variables d’environnement
Modifier des clés de la base de registres
Ajouter, modifier et supprimer des utilisateurs NT
Redémarrer, verrouiller des stations de travail
Windows Script Host est intrinsèque à Microsoft Windows 98, 2000, and Millennium. Cependant,
l’installation de Windows 98 ne provoque pas l’installation de Windows Script Host. Vous devez
donc l’installer manuellement. Si vous utilisez Windows 95 ou NT 4.0, vous devez posséder
Internet Explorer 4 ou plus et vous pouvez télécharger Windows Script Host à partir du site web
de Microsoft à l’adresse http://msdn.microsoft.com/scripting . Sous Windows NT 4.0,
l’installation de l’Option Pack 4 remédie à la situation.
DescoDev
1. Introduction à Windows Script Host
3
Architecture de Windows Script Host
Lors de l’exécution d’un script, trois différentes couches de composants sont sollicitées.
1. L’exécution d’un script est d’abord lancée par un hôte qui charge le moteur de script
approprié au langage utilisé au sein du script.
2. Le moteur de script précédemment chargé interprète le script et invoque les différentes
fonctions utilisées. Ces fonctions sont stockées au sein de fichiers binaires et sont
regroupées au sein de modèles d’objets.
3. Les modèles d’objets contiennent les fonctionnalités nécessaires à l’exécution de
tâches administratives.
Hôtes
Les hôtes sont les programmes qui exécutent les scripts au sein de leur propre processus. Bien
avant WSH, les scripts pouvaient être exécutés par IIS et Internet Explorer ce qui réduisait
l’utilisation des scripts à l’environnement web. Désormais, grâce à CScript.exe et WScript.exe,
les scripts peuvent être exécutés à l’extérieur du web.
Moteurs de scripts
La grande majorité des scripts sont écrits à l’aide de Microsoft JScript ou VBScript puisque ces
moteurs de script sont implantés au sein même de Microsoft Windows 98, 2000 et Millennium.
Cependant, il est possible d’utiliser d’autres moteurs de scripts tels Perl, REXX et Python au sein
du même environnement Windows Script Host.
Lorsque l’hôte a déterminé quel langage est utilisé au sein du script, il charge le moteur de script
approprié et lui passe le script afin d’être exécuté. Notez que le moteur de script n’a pour tâche
que d’interpréter le script et d’invoquer l’exécution des fonctions appropriées stockées au sein de
fichiers binaires que sont les modèles d’objets.
Un fichier de script écrit à l’aide du langage JScript devra posséder l’extension *.js tandis qu’un
fichier de script écrit à l’aide du langage VBScript devra posséder l’extension *.vbs. Ces
extensions sont enregistrés au sein de la base de registres de Windows ce qui en permet
l’exécution simplement en double-cliquant sur le fichier. Lorsque vous activez ces types de
DescoDev
1. Introduction à Windows Script Host
4
fichiers, Windows démarre Windows Script Host qui, ce dernier, se charge d’invoquer le moteur
de script approprié afin d’interpréter le script.
Modèles d’objets
Les scripts utilisent des objets prédéfinis. Un objet peut être perçu comme un lot de
fonctionnalités regroupés thématiquement sous une appellation nommée Modèle d’objets. Vous
utilisez les objets au sein de vos scripts afin d’accéder aux fonctionnalités de l’ordinateur, de la
base de registre, du réseau, etc. Ces objets sont compilés au sein de fichiers binaires aux
extensions *.ocx ou *.dll et seront généralement stockés dans le répertoire système de
l’ordinateur.
WSH est grandement extensible. Vous pouvez donc installer des moteurs de script et des modèles d’objets
supplémentaires. Cependant, les autres moteurs de script que VBScript et JScript et les autres modèles
d’objets doivent préalablement être adéquatement enregistrés au sein de la base de registre avant d’être
utilisés.
DescoDev
1. Introduction à Windows Script Host
5
Création et exécution des scripts
Un script Windows est un fichier texte standard. Vous pouvez créer un script à l’aide de n’importe
lequel éditeur de texte tant que celui-ci n’insère pas de balises de mise en forme du texte tel que
Winword ou Wordpad. Ainsi, le plus répandu des éditeurs de texte standard demeure Bloc-notes
(Notepad). Afin d’être adéquatement reconnu par WSH, le fichier devra posséder une des
extensions compatibles (*.js, *.vbs, or *.wsf).
Création d’un script à l’aide de Bloc-notes
1. Démarrez Bloc-notes (Notepad).
2. Écrivez le texte suivant :
WScript.Echo "Allô la planète!"
CH01\Allo.vbs
3. Sauvegardez ce fichier en lui donnant l’extension *.vbs à la place de l’extension *.txt
insérée par défaut par Bloc-notes. Vous créez ainsi un fichier qui devra être interprété
par le moteur de scripts VBScript.
4. Localisez le fichier que vous venez de créer et activez-le en double-cliquant sur son
icône. Windows Script Host invoque le moteur VBScript qui exécute votre script. La boîte
de message suivante s’affiche alors à l’utilisateur:
Exécution d’un script à l’invite de commande
WScript.exe est l’hôte utilisé par défaut par Windows pour exécuter les scripts. C’est donc cet
hôte qui est invoqué automatiquement lorsque vous activez un script en double-cliquant sur son
icône. Vous pouvez cependant utiliser un autre hôte, CScript.exe, qui est une version à l’invite de
commande de WScript.exe et qui peut être utilisée pour lancer l’exécution de scripts à partir de
fichiers Batch (*.bat).
cscript [options de l'hôte...] [nom du script] [paramètres du script]
•
Options de l'hôte permet d'activer ou de désactiver un certain nombre de fonctionnalités
Windows Script Host. Les options de l'hôte sont précédées de deux barres obliques (//).
•
Nom du script est le nom du fichier de script avec son extension et les informations de
chemin appropriées, par exemple, d:\admin\vbscripts\chart.vbs.
•
Les paramètres du script sont transmis au script en tant que ligne de commande. Les
paramètres destinés au script sont précédés d'une seule barre oblique (/).
DescoDev
1. Introduction à Windows Script Host
6
Exemples de l’exécution de scripts à l’invite de commande :
cscript //logo c:\scripts\script.vbs
cscript //nologo //B "c:\sample scripts\script.vbs"
Voici la liste complète des différents options de l’hôte que vous pouvez utiliser lors de l’exécution
de scripts à l’invite de commande.
Option
//B
//D
//E:moteur
//H:Cscript
//H:Wscript
//I
//Job:JobID
//logo
//nologo
//S
//T:nn
//U
//X
//?
Description
Mode Batch. Supprime l'affichage d'invites utilisateur et d'erreurs de
script sur la ligne de commande. Le mode par défaut est le mode
Interactive.
Active le débogueur. Voyez plus loin dans ce chapitre les explications
au sujet de l’utilisation du débogueur.
Exécute le script avec le moteur de script spécifié.
Définit CScript.exe comme l'application par défaut pour l'exécution de
scripts pour la durée de la session active de l’utilisateur. Spécifiez
l’option //S i vous désirez conserver cette valeur pour les prochaines
sessions de l’utilisateur.
Définit WScript.exe comme l'application par défaut pour l'exécution
de scripts pour la durée de la session active de l’utilisateur. Spécifiez
l’option //S i vous désirez conserver cette valeur pour les prochaines
sessions de l’utilisateur.
Mode Interactif ; permet d'afficher les invites utilisateur et les erreurs
de script. Opposé du mode Batch.
Exécute le numéro d'ID de tâche spécifié à partir du fichier *.wsf.
Affiche une bannière. Opposé de nologo.
Empêche l'affichage d'une bannière d'exécution lors de l'exécution.
Le paramètre par défaut est logo.
Enregistre les options de ligne de commande actuelles et les définies
par défaut pour cet utilisateur.
Active le délai d'expiration : le nombre maximal de secondes pendant
lesquelles le script peut être exécuté au delà de lesquelles le script
doit être interrompu. Ce paramètre empêche des délais d'exécution
excessifs à l'aide d'une horloge. La valeur par défaut est illimitée.
Utilisé avec Windows NT et Windows 2000 pour forcer la sortie de
ligne de commande à utiliser les caractères Unicode. CScript est
incapable de déterminer si la sortie doit être en Unicode ou en ANSI ;
par défaut, il produit la sortie en ANSI.
Lance le programme dans le débogueur. Voyez plus loin dans ce
chapitre les explications au sujet de l’utilisation du débogueur.
Affiche une courte description des paramètres de commande ainsi
que des informations d'utilisation.
DescoDev
1. Introduction à Windows Script Host
7
Utilisation du débogueur
Lorsque vous lancez l’exécution de votre script à partir de l’invite de commande en combinaison
avec les options //D et //X, le débogueur est activé et le script lancé y est chargé afin d’être
exécuté pas-à-pas. Le débogueur vous permettra de suivre étapes après étapes l’exécution de
vos scripts afin d’en localiser plus aisément les erreurs.
Microsoft Script Debugger doit être installé sur votre ordinateur afin de pouvoir déboguer vos
scripts. Microsoft Script Debugger est intégré aux différentes versions de Windows 2000 mais ne
fait pas partie des composants s’installant par défaut lors de l’installation du système
d’exploitation. Pour l’installer, vous devez activer Démarrer J Paramètres J Panneau de
configuration J Ajout/Suppression de programmes J Ajouter/Supprimer des composants
Windows. Sous les autres versions de Windows, vous devez installer manuellement Microsoft
Script Debugger qu’il est possible de télécharger gratuitement à partir de l’adresse suivante :
http://msdn.microsoft.com/downloads/default.asp?url=/downloads/topic.asp?url=/msdnfiles/028/001/175/topic.xml
Dès le lancement de
l’exécution de votre script,
Microsoft Script Debugger
s’affiche et met en
surbrillance la ligne qu’il
s’apprête à exécuter.
Plusieurs fenêtres peuvent
être affichées afin de
visualiser certaines
informations utiles dont le
numéro assigné par
Windows au thread courant
(était-ce vraiment
nécessaire Bill ?)
Maintenant, si vous appuyez sur la touche F8, vous verrez l’exécution de votre code s’exécuter
pas-à-pas. Notez que la ligne de code en surbrillance est la ligne qui s’apprête à être exécutée et
non celle qui vient de l’être.
Lorsqu’une erreur survient au sein d’un script, une boîte de message demande à l’utilisateur s’il désire
déboguer le script. Microsoft InterDev est alors automatiquement exécuté lorsque celui-ci est installé sur
l’ordinateur. Ceux qui veulent modifier ce comportement par défaut et exiger l’utilisation de Microsoft Script
Debugger afin de déboguer les scripts erronés doivent modifier la base de registres et assigner la valeur
C:\Program Files\Microsoft Script Debugger\msscrdbg.exe à la clé
HKEY_CLASSES_ROOT\CLSID\{834128A2-51F4-11D0-8F20-00805F2CD064}\LocalServer32.
Si vous désirez revenir à l’utilisation de Visual InterDev, modifiez la clé pour lui assigner la valeur
C:\Program Files\Microsoft Script Debugger\mdm.exe.
DescoDev
1. Introduction à Windows Script Host
Icône Raccourci
8
Description
(F5)
Interrompt l’exécution pas-à-pas afin de continuer l’exécution
normale du script.
(Shift + F5)
Interrompt le débogueur ainsi que l’exécution du script.
(F8)
(Shift + F8)
(Ctrl + Shift + F8)
(F9)
(Ctrl + Shift + F9)
Interrompt l’exécution pas-à-pas afin de continuer l’exécution
normale du script jusqu’au prochain point d’arrêt.
Continue l’exécution pas-à-pas en entrant dans le code des sousprocédures appelées si celles-ci n’appartiennent pas à un code
compilé.
Continue l’exécution pas-à-pas en n’entrant pas dans le code des
sous-procédures appelées même si celles-ci n’appartiennent pas à
un code compilé.
Continue l’exécution pas-à-pas en quittant le code d’une sousprocédure.
Place un point d’arrêt sur la ligne pointée. Ainsi, lors d’une
exécution continue du script, un arrêt de l’exécution sera provoquée
avant que la ligne pointée ne soit exécutée. Permet également de
supprimer un point d’arrêt existant sur la ligne pointée.
Supprime l’ensemble des points d’arrêt précédemment créés.
DescoDev
2. Le langage VBScript
9
2
Le langage VBScript
DescoDev
2. Le langage VBScript
10
2. Le langage VBScript
VBScript est un des langages natifs à Windows Script Host avec le JScript. Le langage VBScript
est moins stricte que son homologue et demeure donc plus accessible que le JScript. Le langage
VBScript tire ses racines du Visual Basic et en emprunte donc la majorité des structures et des
éléments syntaxiques.
Règles fondamentales
D’abord, sachez que le VBScript n’est pas discriminant à la casse et que, conséquemment,
vous pouvez alterner les minuscules et les majuscules au sein de votre code sans aucune
différence pour le moteur de script. Ainsi, les trois instructions suivantes sont équivalentes :
WScript.Echo
wscript.echo
WSCRIPT.ECHO
Cependant, il est déconseillé d’écrire l’ensemble du code complètement en minuscules ou
complètement en majuscules puisque cette pratique produit des codes difficilement lisibles.
Ensuite, VBScript ne tient pas compte des espaces supplémentaires qui pourraient être
insérées au sein du code. Ainsi, les deux instructions suivantes son équivalentes :
WScript.Echo "Allô la planète"
WScript.
Echo
"Allô la planète"
VBScript n’impose aucun maximum quant au nombre de caractères sur une même ligne tel que
d’autres langages tels que Visual Basic lui-même. Cependant, il peut être intéressant de contenir
le code en largeur pour des fins de lisibilité. VBScript vous permet donc de briser une ligne de
code et de la continuer sur la ligne suivante en insérant un caractère de continuation
composé d’un espace suivi d’un trait de soulignement ( _) :
WScript.Echo "Message à " & vUtilisateur _
& " Veuillez vous assurer de verrouiller ou " _
& " de fermer votre station avant de quitter."
Par ailleurs, il vous est possible d’inscrire plusieurs instructions sur une même ligne en les
séparant par un symbole deux-points ( : ). Ainsi, la ligne suivante :
WScript.Echo "Bonjour"
:
WScript.Echo "Bonsoir"
est équivalente aux lignes suivantes :
WScript.Echo "Bonjour"
WScript.Echo "Bonsoir"
Cependant, cette pratique tend grandement à diminuer la lisibilité du code.
DescoDev
2. Le langage VBScript
11
L’utilisation de variables
Les variables permettent au programmeur d’accéder à la mémoire de l’ordinateur afin d’y stocker
et d’y récupérer des données. Une variable possède un nom agissant en tant qu’alias vers une
adresse-mémoire donnée et le programmeur peut accéder au contenu de cette adresse-mémoire
tout simplement en utilisant le nom de la variable.
MaVariable = 15
‘ Stocke la valeur 15 dans la variable
WScript.Echo MaVariable
‘ Affiche le contenu de la variable : 15
MaVariable = MaVariable + 10
‘ Stocke le résultat de l’addition 15 + 10
WScript.Echo MaVariable
‘ Affiche le contenu de la variable : 25
Vous remarquez certainement que le contenu d’une variable peut changer au cours de
l’exécution du script. Cependant, une variable ne peut contenir qu’une seule donnée à la fois. On
peut parfois nommer ces variables « scalaires » en oppositions aux variables « vectorielles »
pouvant contenir plusieurs valeurs que la programmation informatique nomme « tableaux ». Il
sera question des tableaux plus loin.
Les variables peuvent manipuler des données de différents types.
•
Les variables numériques peuvent contenir des valeurs numériques entières ou réelles
sur lesquelles diverses opérations mathématiques peuvent être effectuées.
nChiffreA = 5
nChiffreB = 10
nChiffreC = (nChiffreA * 2) + nChiffreB
•
Les variables chaînes de caractères peuvent contenir une suite de caractères qui, mis
ensembles, forment un mot, une phrase ou une expression. Certaines opérations
typiques aux chaînes de caractères peuvent être effectuées sur ces variables. Une
nouvelle valeur est attribuée à ce type de variables en incluant les caractères entre deux
guillemets ( " " ) :
strNom = "Pinchaud"
strVoiture = "Ford Mustang"
WScript.Echo strNom & " conduit une voiture " & strVoiture
•
Les variables dates peuvent contenir des dates. Certaines opérations typiques aux dates
peuvent être effectuées sur ces variables. Une nouvelle valeur est attribuée à ce type de
variables en incluant la date entre deux dièses ( # # ):
dAujourdhui = #15-03-2002#
DescoDev
2. Le langage VBScript
12
La déclaration de variables
La déclaration d’une variable est l’acte par laquelle le programme spécifie au script la liste des
variables qui seront utilisées et que le script doit s’attendre à rencontre au sein des différentes
instructions composants ce script.
Quoique la majorité des langages de programmation requièrent la déclaration des variables avant
que celles-ci ne puissent être utilisées au sein du code, VBScript n’impose pas cette restriction.
VBScript considère qu’une variable est déclarée dès la première fois qu’elle est référencée au
sein du code. Brièvement, dès que VBScript rencontre une expression qui n’est ni le nom d’une
procédure ni un mot-clé réservé par le langage, il considère qu’il s’agit conséquemment d’une
variable et procède automatiquement à sa déclaration. Ne voyez pas ce comportement comme
une échappatoire vers la simplicité mais plutôt comme une source fréquente d’erreurs difficiles à
diagnostiquer. Dans l’exemple suivant, le programmeur a effectué une faute de frappe. Le script
ne génère aucune erreur mais ne produit pas le résultat attendu :
nMonAge = 30
nMonAge = nMoAge + 10
WScript.Echo nMonAge
Le script affiche 10 alors que, à première vue, il devrait afficher le résultat de l’addition de 30 + 10
et conséquemment afficher 40. Cependant, sur la deuxième ligne de code, le programmeur a
nommé la variable nMoAge au lieu de nMonAge. VBScript y a vu une nouvelle expression et a
déclaré une seconde variable qu’il a initialisé à zéro. Ainsi, la variable nMonAge se fait assigner
le résultat de l’addition de 0 + 10. Puisque ce type d’erreurs est difficile à diagnostiquer, il nous
sera préférable de demander à VBScript de modifier son comportement par défaut en nous
obligeant à déclarer dûment nos variables en introduisant la directive Option Explicit en tant
que toute première instruction au sein de nos scripts :
Option Explicit
Ainsi, chacune des variables devra préalablement être déclarée avant d’être utilisée au sein
du code. Toute faute de frappe interromprait l’exécution du script et provoquerait le soulèvement
d’une erreur #800A01F4 ('Variable non définie') par VBScript comme suit :
Il ne s’agit pas ici de chercher à provoquer inutilement des erreurs mais plutôt de se donner les
outils nécessaires afin d’être en mesure de les détecter afin d’obtenir un script efficace produisant
les résultats réellement attendus.
DescoDev
2. Le langage VBScript
13
La déclaration d’une variable peut s’effectuer à l’aide d’un des quatre mots-clé réservés suivants :
•
•
•
•
Dim provoque la déclaration d’une variable privée.
Private provoque la déclaration d’une variable privée.
Public provoque la déclaration d’une variable publique.
Static provoque la déclaration d’une variable statique interne à la procédure.
Nous éclaircirons plus loin au sein de ce chapitre la signification de chacun de ces mots-clé mais
sachez pour l’instant que vous pouvez utiliser l’un ou l’autre de ces mots-clé afin de déclarer
adéquatement une variable comme dans le script suivant :
Option Explicit
Dim objNet
Set objNet = CreateObject("WScript.Network")
objNet.MapNetworkDrive "Z:", "\\serveur\partage"
WScript.Echo "Le lecteur Z: est connecté!"
CH02\map.vbs
Finalement, le nom d’une variable doit débuter par un caractère alphabétique (a-z, A-Z), peut
subséquemment contenir des caractères alphanumériques mais ne peut posséder un point ( . ) et
ne peut excéder 255 caractères en longueur.
Quoiqu’aucune autre règle formelle autre que celles énumérées précédemment ne soit prévue
par VBScript au sujet de la nomination des variables, certaines conventions établies par la
maturité de la programmation informatique proposent certaines pratiques permettant d’augmenter
la lisibilité du code. Une de ces conventions stipule qu’il peut être bon de réserver certains des
premiers caractères composants le nom d’une variable afin d’identifier le type de données qu’y
sera stocké. Le tableau présente certains exemples mettant en œuvre cette convention :
Type de variable
Exemple
n
Valeur numérique (tous types confondus)
Dim nCompteur
b
Valeur booléenne
Dim bReponse
d
Date
Dim dAujourdhui
obj
Variable-objet
Dim objNet
str
Chaîne de caractères
Dim strAdresse
DescoDev
2. Le langage VBScript
14
Déclaration et utilisation de constantes
Une constante est une variable à laquelle une valeur est assignée au début du code et qui ne
peut être modifiée et qui doit demeurer inchangée tout au long de l’exécution du script.
L’utilisation de constantes permet simplement d’augmenter la lisibilité de votre code et d’en
simplifier efficacement la compréhension et la gestion. Donc, au lieu d’utiliser un code comme le
suivant :
MaVariableA
MaVariableB
= 3.1416 * 2
= 3.1416 * 4
La déclaration d’une constante à l’aide du mot-clé Const en augmenterait la compréhension :
Const PI = 3.1416
MaVariableA = PI * 2
MaVariableB = PI * 4
si, lors de la conception de votre code, vous aviez à modifier la totalité des endroits où la valeur
de PI est utilisée, vous n’auriez qu’à modifier la valeur de la constante pour que les modifications
ne se répercutent dans l’ensemble du script.
Const PI = 3.1415923
MaVariableA = PI * 2
MaVariableB = PI * 4
Utilisation de constantes existantes
Les différents modèles d’objets que vous apprendrez à manipuler prévoient une pluralité de
constantes que vous pouvez utiliser au sein de vos scripts. Vous pouvez connaître ces
constantes en consultant la documentation appropriée ou en consultant un navigateur d’objets tel
celui fourni avec Microsoft Visual Basic ou Microsoft Access. Vous apprendrez à utiliser un
navigateur d’objets à la fin du présent chapitre.
Le langage VBScript prévoit également plusieurs constantes permettant de manipuler plus
aisément les différents éléments du langage. Notez que la valeur des constantes peut être
déclarée en valeur hexadécimale en précédant la valeur de la constante par le préfixe &H. Ainsi,
une constante déclarée comme possédant la valeur &H20 vaut réellement 32 en décimal.
Par exemple, l’instruction suivante :
WScript.Echo "Bonjour " & vbCrLf & "Nous sommes le " & Date()
L’exemple ci-haut affiche le résultat ci-contre.
Notez l’utilisation de la constante vbCrLf
forçant le saut de ligne entre les deux
expressions.
La liste complète des constantes intrinsèques
à VBScript vous seront présentées au fil du
présent chapitre.
DescoDev
2. Le langage VBScript
15
Types de données et conversion explicite
Un type de données s’applique généralement à une variable et défini quel type d’informations
pourront être stockés par cette variable. Par exemple, une variable pourrait pouvoir contenir des
valeurs numériques entières tandis qu’une autre variable pourrait pouvoir contenir des chaînes
de caractères. L’utilisation du type de données approprié peut devenir importante lorsque, par
exemple, le contenu des variables X et Y sont additionnés afin d’en récupérer le résultat :
X = 4
Y = 2
Z = X + Y
'Z vaut 6
Ainsi, lorsque les variables X et Y sont de type nombre entier, Z prendra la valeur 6, résultat de
l’addition mathématique des deux entiers. Cependant, considérez l’exemple suivant :
X = "4"
Y = "2"
Z = X + Y
'Z vaut "42"
Lorsque les variables X et Y sont de type caractère, Z prendra la valeur "42", résultat de la
concaténation des deux chaînes de caractères mises bout à bout.
Contrairement à la majorité des langages structurés, VBScript ne reconnaît qu’un seul type de
données pour dimensionner les variables : le type de données variant. Différentes fonctions de
conversion explicite permettent, par exemple, de convertir des chaînes de caractères en valeurs
numériques entières afin d’appliquer une addition mathématique adéquate sur ces valeurs :
X = "4"
Y = "2"
Z = CInt(X) + CInt(Y)
'Z vaut 6
Lorsque la valeur des variables X et Y sont explicitement converties en valeurs numériques
entières à l’aide de la fonction CInt, Z prendra la valeur 6, résultat de l’addition mathématique
des deux chaînes de caractères préalablement converties en entiers.
Fonction
Description
CBool
Retourne une valeur booléenne (True|False).
CByte
Retourne un entier contenu entre 0 et 255.
Retourne un réel contenu entre –922 337 203 685 477.5808 et
+922 337 203 685 477.5807.
Retourne une date valide.
Retourne un réel contenu entre –1.797 693 134 862 32 E308 et
–4.940 656 458 412 47E-324 pour les valeurs négatives et entre 4.940 656 458
412 47E-324 et 1.797 693 134 862 32 E308 pour les valeurs positives.
Retourne un entier contenu entre –32 768 et +32 767.
CCur
CDate
CDbl
CInt
CLng
CSng
CStr
Retourne un entier contenu entre –2 147 483 648 et +2 147 483 647.
Retourne un réel contenu entre –3.402 823 E38 et –1.401 298 E-45 pour les
valeurs négatives et entre 1.401 298 E-45 et 3.402 823 E38 pour les valeurs
positives.
Retourne une chaîne de caractères.
DescoDev
2. Le langage VBScript
16
Les opérateurs
Les opérateurs sont des symboles réservés par le langage VBScript permettant une pluralité
d’opérations arithmétiques, logiques, comparatives et autres. Ainsi, vous ne pouvez vous servir
de ces symboles pour d’autres fins que celles prescrites par le langage.
Opérateurs arithmétiques
Les opérateurs arithmétiques permettent d’effectuer des opérations arithmétiques telles l’addition,
la soustraction, la multiplication, etc.
Opérateur
Description
Exemple
Z = 4 ^ 2
+
Soulève un nombre à la puissance spécifiée.
Précise l’inverse arithmétique d’un nombre ou
d’une expression.
Multiplie deux nombres.
Divise deux nombres en conservant les
décimales le cas échéant.
Divise deux nombres en tronquant les
décimales le cas échéant.
Retourne le reste d’une division entière
(modulo).
Additionne deux nombres.
-
Soustrait deux nombres.
^
*
/
\
Mod
' donne 16.
Z = -(3 * 4) ' donne –12.
Z = 3 * 4
Z = 9 / 4
' donne 2,25.
Z = 9 \ 4
' donne 2.
Z = 9 mod 4
' donne 1.
Z = 4 + 3
Z = 4 – 3
Tâchez de bien distinguer les deux opérateurs de division dont l’un deux ne considère pas les
décimales le cas échéant et qui peut produire des résultats inattendus s’il est incorrectement
utilisé.
Opérateur de concaténation
La concaténation est une opération qui s’applique sur des chaînes de caractères seulement.
Cette opération permet d’embouter deux chaînes de caractères afin de n’en former qu’une seule.
strPrnom = "Joe"
strNom = "Castagnette"
WScript.Echo strPrnom & " " & strNom
‘ Affiche "Joe Castagnette"
L’opérateur de concaténation ne s’appliquant que sur des chaînes de caractères, il procèdera à
une conversion explicite en chaînes de caractères si des valeurs numériques lui sont fournies.
X = 2
Y = 6
WScript.Echo X & Y
Opérateur
&
‘ Affiche "26"
Description
Exemple
Concatène deux chaînes de caractères.
strA = strPrnom & strNom
DescoDev
2. Le langage VBScript
17
Opérateurs de comparaison
Ces opérateurs permettent de comparer deux valeurs. Le résultat de la comparaison s’évalue
toujours par True ou False. L’utilité des opérateurs de comparaison prendra tout son sens
lorsque nous aborderons les structures de contrôle plus loin dans ce chapitre.
Opérateur
=
<>
>
<
>=
<=
Is
Description
Exemple
Retourne True si les deux valeurs sont égales.
Retourne True si les deux valeurs sont
différentes.
Retourne True si la valeur de gauche est plus
grande que la valeur de droite.
Retourne True si la valeur de gauche est plus
petite que la valeur de droite.
Retourne True si la valeur de gauche est plus
grande ou égale à la valeur de droite.
Retourne True si la valeur de gauche est plus
petite ou égale à la valeur de droite.
Retourne True si les deux objets sont les
mêmes.
bResultat = x = 5
bResultat = x <> 5
bResultat = x > 5
bResultat = x < 5
bResultat = x >= 5
bResultat = x <= 5
bResultat = objX Is objY
Opérateurs logiques
Tout comme les opérateurs de comparaison, le résultat généré par l’utilisation des opérateurs
logiques s’évalue toujours par True ou False. L’utilité des opérateurs logiques prendra tout son
sens lorsque nous aborderons les structures de contrôle plus loin dans ce chapitre.
Opérateur
Not
And
Or
XOr
Eqv
Imp
Description
Exemple
Retourne la négation logique de l’expression.
Retourne la conjonction logique de deux
expressions.
Retourne la disjonction logique de deux
expressions.
Retourne la disjonction logique exclusive de
deux expressions.
Retourne l’équivalence logique de deux
expressions.
Retourne l’implication logique de deux
expressions.
bR = Not (X < 1)
bR = (X > 2) And (Y =1)
bR = (X > 2) Or (Y =1)
bR = (X > 2) XOr (Y =1)
bR = 2 Eqv (6 / 3)
bR = 2 Imp objNull
DescoDev
2. Le langage VBScript
18
Voici les tables de vérité des opérateurs logiques. Les expressions Expr1 et Expr2 combinées à
l’aide de l’opérateur concerné donnent le résultat spécifié dans la colonne =.
Not
Expr
Faux
Vrai
=
Vrai
Faux
Expr1
Faux
Faux
Vrai
Vrai
And
Expr2
Faux
Vrai
Faux
Vrai
=
Faux
Faux
Faux
Vrai
Expr1
Faux
Faux
Vrai
Vrai
Or
Expr2
Faux
Vrai
Faux
Vrai
=
Faux
Vrai
Vrai
Vrai
Expr1
Faux
Faux
Vrai
Vrai
XOr
Expr2
Faux
Vrai
Faux
Vrai
=
Faux
Vrai
Vrai
Faux
Expr1
Faux
Faux
Vrai
Vrai
Eqv
Expr2
Faux
Vrai
Faux
Vrai
=
Vrai
Faux
Faux
Vrai
Expr1
Faux
Vrai
Vrai
Faux
Vrai
Faux
Null
Null
Null
Imp
Expr2
Faux
Faux
Null
Vrai
Vrai
Null
Vrai
Faux
Null
=
Vrai
Faux
Null
Vrai
Vrai
Vrai
Vrai
Null
Null
DescoDev
2. Le langage VBScript
19
Priorité des opérateurs
L’ensemble des opérateurs sont reliés selon un ordre de priorité très précise régissant l’ordre
dans laquelle les différentes expressions doivent être évaluées par le moteur de script afin d’en
calculer le résultat. Ainsi, VBScript évaluera l’expression suivante :
X = 4 + 2 * 6
et obtiendra le résultat 16 et non le résultat 36. Le secret réside dans la priorité des opérateurs
qui stipule entres autres que la multiplication est prioritaire à l’addition. Voyez comment VBScript
évalue l’expression précédente :
X = 4 + 2 *
X = 4
X =
+
6
12
16
Afin de s’assurer d’obtenir les résultats escomptés sans trop se soucier de la priorité des
opérateurs, il suffit d’insérer explicitement des parenthèses qui demeurent les opérateurs
possédant la plus forte priorité :
X = 4 + (2 * 6)
X = (4 + 2) * 6
‘ Donne 16 et le code est clair !
‘ Donne 36 et le code est clair !
Voici le tableau complet des opérateurs VBScript présentés en ordre décroissant de priorité.
Priorité
Opérateur(s)
Description(s)
14
()
Parenthèses explicites.
13
^
Exposant.
12
-
Inverse arithmétique.
11
*/ \
Multiplication, division réelle et division entière.
10
Mod
Modulo.
9
+-
Addition et soustraction.
8
&
Concaténation de chaînes de caractères.
7
=, <>, >, <, >=, <=, Is
Comparaisons.
6
Not
Inverse logique.
5
And
Conjonction logique.
4
Or
Disjonction logique.
3
XOr
Disjonction logique exclusive.
2
Eqv
Équivalence logique.
1
Imp
Implication logique.
DescoDev
2. Le langage VBScript
20
Structures de contrôle et conditions
L’exécution du code de votre script peut être contrôlé par diverses expressions appelées
structures de contrôles. Les structures de contrôles sont réunies en deux groupes :
•
Les structures de branchement, ou tests alternatifs, permettent d’exécuter un bloc de
code lorsqu’une condition est rencontrée et d’exécuter un bloc de code différent lorsque
la même condition n’est pas respectée.
•
Les structures répétitives, ou itérations, permettent de répéter l’exécution d’un bloc de
code tant qu’une condition est rencontrée ou qu’elle n’est pas respectée.
La structure de branchement If…Else…End If
Cette structure de branchement permet d’exécuter un bloc de code si une condition spécifiée est
remplie.
Le code s’exécute seulement lorsque la condition
peut positivement être évaluée par True. Dans
tous les autres cas, aucun code supplémentaire
n’est exécuté.
La syntaxe de cette structure de branchement est
la suivante :
If <condition> Then
<Code à exécuter>
End If
L’exemple suivant tire un nombre aléatoire entre 0 et 100 et en affiche la valeur. Lorsque X est un
nombre pair, une boîte de dialogue le précise à l’utilisateur :
Randomize
X = CInt(Rnd * 100)
WScript.Echo "X vaut " & X
If (X Mod 2 = 0) Then
WScript.Echo "X est un nombre pair."
End If
Il est possible d’écrire un branchement If sur une seule ligne lorsque le code à exécuter est
constitué d’une seule instruction au lieu d’un bloc d’instructions :
If (X Mod 2 = 0) Then WScript.Echo "X est un nombre pair."
Cependant, cette syntaxe diminue la lisibilité du code et ne permet l’exécution d’une seule
instruction au sein du bloc If. Notez que cette syntaxe ne nécessite pas l’insertion de
l’instruction End If à la fin de la structure de branchement.
DescoDev
2. Le langage VBScript
21
La structure peut être étendue afin d’intégrer un branchement alternatif Else dont le code ne
s’exécutera que lorsque la condition ne sera pas rencontrée.
Le premier code s’exécute seulement lorsque la
condition peut positivement être évaluée par
True. Dans tous les autres cas, le second code
est exécuté. Un des deux codes est
nécessairement exécuté dans tous les cas et
seulement un des deux codes est exécuté.
La syntaxe de cette structure de branchement
est la suivante :
If <condition> Then
<Code à exécuter>
Else
<Code à exécuter>
End If
Voici le même exemple présenté précédemment à lequel un branchement Else a été ajouté :
Randomize
X = CInt(Rnd * 100)
WScript.Echo "X vaut " & X
If (X Mod 2 = 0) Then
WScript.Echo "X est un nombre pair."
Else
WScript.Echo "X est un nombre impair."
End If
DescoDev
2. Le langage VBScript
22
La structure de branchement Select Case…End Select
Cette structure de branchement permet d’exécuter un bloc de code selon la valeur d’une
expression spécifiée.
Un seul des blocs de code s’exécute selon la valeur de
l’expression soumise à l’évaluation.
La syntaxe de cette structure de branchement est la
suivante :
Select Case <expression>
Case <valeur1>
<Code à exécuter>
Case <valeur2>
<Code à exécuter>
Case Else
<Code à exécuter>
End Select
Si aucun des branchements ne correspond à
l’expression spécifiée, le bloc facultatif Case Else est
exécuté s’il a été spécifié.
L’exemple simple suivant montre l’utilisation de la structure Select Case. Notez que vous
pouvez toujours insérer le nombre de blocs Case que désiré et que le bloc Case Else est
facultatif.
Select Case X
Case 0
WScript.Echo "X = 0"
Case 1
WScript.Echo "X = 1"
Case 2
WScript.Echo "X = 2"
Case Else
WScript.Echo "Désolé, la valeur est invalide!"
End Select
Voici un autre exemple de l’application de cette structure de branchement :
Select Case X
Case 0 To 9
WScript.Echo "X est entre 0 et 9."
Case 10 To 99
WScript.Echo "X est entre 10 et 99."
Case Is > 99
WScript.Echo "X est plus grand que 99."
End Select
DescoDev
2. Le langage VBScript
23
Structures répétitives Do While/Until … Loop
Ces structures répétitives sont utilisées afin de répéter une instruction ou un certain bloc de code.
Le code est exécuté tant que la condition est vraie (boucle while)
ou jusqu’à ce que la condition soit vraie (boucle Until). Lorsque la
condition n’est plus remplie (boucle while) ou lorsqu’elle est
remplie (boucle Until), l’exécution quitte la boucle afin de
poursuivre normalement le code suivant.
Les syntaxes de ces structures répétitives sont les suivantes :
Do While <condition>
<Code à exécuter>
Loop
Do Until <condition>
<Code à exécuter>
Loop
Voici un exemple simple de la mise en œuvre de ces structures répétitives. La boîte de message
est affichée 10 fois en affichant chacune des valeurs entre 0 et 9 inclusivement :
nNbr = 0
Do While nNbr < 10
WScript.Echo "nNbr vaut " & nNbr
nNbr = nNbr + 1
Loop
Le même résultat peut être obtenu à l’aide de la boucle Do Until à la condition de modifier la
condition :
nNbr = 0
Do Until nNbr = 10
WScript.Echo "nNbr vaut " & nNbr
nNbr = nNbr + 1
Loop
Il est possible de quitter prématurément une boucle à l’aide de l’instruction Exit Do. Lorsque cette
instruction est rencontrée, la structure répétitive est quittée peu importe l’état de la condition
gérant la boucle.
L’exemple suivant génère le même résultat que les deux boucles présentées précédemment :
nNbr = 0
Do
WScript.Echo "nNbr vaut " & nNbr
nNbr = nNbr + 1
If nNbr >= 10 Then Exit Do
Loop
DescoDev
2. Le langage VBScript
24
Structures répétitives Do … Loop While/Until
Comme les structures présentées précédemment, ces structures répétitives sont utilisées afin de
répéter une instruction ou un certain bloc de code.
Le code est exécuté tant que la condition est vraie (boucle while)
ou jusqu’à ce que la condition soit vraie (boucle Until). Lorsque la
condition n’est plus remplie (boucle while) ou lorsqu’elle est
remplie (boucle Until), l’exécution quitte la boucle afin de
poursuivre normalement le code suivant. Notez que,
contrairement aux précédentes boucles Do, les présentes boucles
exécutent le bloc de code au moins une fois puisque la condition
est évaluée après que celui-ci ne soit exécuté.
Les syntaxes de ces structures répétitives sont les suivantes :
Do
<Code à exécuter>
Loop While <condition>
Do
<Code à exécuter>
Loop Until <condition>
Voici un exemple simple de la mise en œuvre de ces structures répétitives. La boîte de message
est affichée 10 fois en affichant chacune des valeurs entre 0 et 9 inclusivement :
nNbr = 0
Do
WScript.Echo "nNbr vaut " & nNbr
nNbr = nNbr + 1
Loop While nNbr < 10
Le même résultat peut être obtenu à l’aide de la boucle Do Until à la condition de modifier la
condition :
nNbr = 0
Do
WScript.Echo "nNbr vaut " & nNbr
nNbr = nNbr + 1
Loop Until nNbr = 10
Ces structures répétitives acceptent également l’utilisation de l’instruction Exit Do.
DescoDev
2. Le langage VBScript
25
Structure répétitive For… Next
Comme les structures présentées précédemment, cette structure répétitive est utilisée afin de
répéter une instruction ou un certain bloc de code. La boucle For… Next présente cependant
l’avantage d’inclure un compteur permettant d’initialiser le nombre d’itérations à exécuter.
Le compteur est d’abord initialisé ainsi que la valeur maximale ou
minimale qu’il doit atteindre. Le code est ensuite répété tant et aussi
longtemps que le compteur n’a pas atteint ou dépassé la valeur
prescrite lors de l’initialisation de la boucle. Le compteur est
automatiquement incrémenté ou décrémenté après l’exécution du
code.
La syntaxe de cette structure répétitive est la suivante :
For <compteur> = <Valeur1> To <Valeur2>
<Code à exécuter>
Next
La variable servant de compteur doit préalablement être déclarée si
votre code prévoit la déclaration explicite des variables à l’aide de la
directive Option Explicit expliquée précédemment au début de
ce chapitre.
Voici un exemple simple de la mise en œuvre de cette structure répétitive. La boîte de message
est affichée 10 fois en affichant chacune des valeurs entre 0 et 9 inclusivement :
For nCpt = 0 To 9
WScript.Echo "nCpt vaut " & nCpt
Next
Il est possible de créer des boucles inversées au sein desquelles la valeur du compteur est
automatiquement décrémentée au lieu d’être incrémentée (par défaut) en spécifiant une valeur
négative à l’instruction facultative Step. L’exemple suivant affiche les valeurs entre 0 et 9
inclusivement mais débute en affichant 9 avant de terminer par 0.
For nCpt = 9 To 0 Step –1
WScript.Echo "nCpt vaut " & nCpt
Next
De la même manière il est possible de créer des boucles dont l’incrémentation ou la
décrémentation du compteur s’effectue par multiple de 2, de 3 ou de toute autre valeur.
L’exemple suivant affiche les nombres pairs compris entre 0 et 20 inclusivement :
For nCpt = 0 To 20 Step 2
WScript.Echo nCpt & " est un nombre pair"
Next
Il est possible de quitter prématurément la boucle For… Next en introduisant l’instruction Exit
For au sein du code à exécuter.
DescoDev
2. Le langage VBScript
26
Structure répétitive For Each… Next
Comme les structures présentées précédemment, cette structure répétitive est utilisée afin de
répéter une instruction ou un certain bloc de code mais utilise le nombre d’objets membres d’une
collection afin d’initialiser le nombre le nombre d’itérations à effectuer. Ces concepts orientés
objets vous seront exposés plus tard.
For Each File in objFiles
WScript.Echo File.Name
Next
Structure répétitive While… Wend
Comme les structures présentées précédemment, cette structure répétitive est utilisée afin de
répéter une instruction ou un certain bloc de code. Cependant, cette structure existe depuis les
débuts du langage Basic et est supplantée par les autres formes de boucles. La boucle
While…Wend a été conservée pour des fins de compatibilité antérieure mais il est conseillé
d’utiliser les autres structures répétitives mieux structurées et plus flexibles.
Le code est exécuté tant que la condition est vraie. Lorsque la
condition n’est plus remplie, l’exécution quitte la boucle afin de
poursuivre normalement le code suivant.
La syntaxe de cette structure répétitive est la suivante :
While <condition>
<Code à exécuter>
Wend
Voici un exemple simple de la mise en œuvre de cette structure répétitive. La boîte de message
est affichée 10 fois en affichant chacune des valeurs entre 0 et 9 inclusivement :
nNbr = 0
While nNbr < 10
WScript.Echo "nNbr vaut " & nNbr
nNbr = nNbr + 1
Wend
Les programmeurs qui auraient utilisé Visual Basic noteront que VBScript ne supporte pas certaines structures
de contrôle de ce langage telles que IIf, Choose et Switch.
DescoDev
2. Le langage VBScript
27
Focus sur la condition
La condition qui régi l’exécution ou non d’un bloc de code au sein d’une structure de contrôle est
toujours évaluée par une valeur booléenne True ou False. VBScript réduira toujours à ce
niveau la valeur de la condition que votre code lui soumet. Dans l’exemple suivant, la condition
est simplement composée d’une valeur numérique :
nVar = 14
Do While nVar
MsgBox "nVar vaut " & nVar
nVar = nVar - 1
Loop
Or, ce script affiche les différentes valeurs de la variable nVar de 14 à 1 puis le code cesse de
s’exécuter. Pourquoi ? Ce comportement s’explique aisément par la façon qu’ont les langages de
programmation d’évaluer les conditions selon l’algorithme booléen qui stipule que :
•
•
Une valeur nulle (0) s’évalue négativement et prend la valeur False.
Toute autre valeur s’évalue positivement et prend la valeur True.
Ainsi, l’exemple précédent évalue positivement la condition de la boucle tant que la variable
nVar possède une valeur différente de zéro.
Il existe également quelques pièges qu’il faut faire attention d’éviter lors de la construction de
boucles et de conditions. Un d’eux provient souvent de la méprise du programmeur à l’égard des
opérateurs logiques AND et OR. Dans l’exemple suivant, le script attend une réponse de
l’utilisateur avant de poursuivre l’exécution. À l’aide d’une boucle, le script s’assure que
l’utilisateur ne puisse entrer que deux réponses possibles… ou, du moins, il croit le faire :
‘********* Ce code est erroné… ne l’essayez-pas ****************’
Do
Reponse = InputBox("Désirez-vous continuer ? (Oui, Non)")
Loop While LCase(Reponse) <> "oui" OR LCase(Reponse) <> "non"
Cependant, la table de vérité de l’opérateur OR stipule que l’une des deux parties de l’expression
évaluée doit être vraie pour que l’expression s’évalue positivement. Ainsi, si l’utilisateur entre la
réponse "non", le script évalue d’abord Reponse <> "oui" et conclu, en effet que cette
affirmation est vraie et, concluant avec raison que la condition est vraie, procède à une nouvelle
itération de la boucle. Le code aurait donc dû se lire comme suit :
Do
Reponse = InputBox("Désirez-vous continuer ? (Oui, Non)")
Loop While LCase(Reponse) <> "oui" AND LCase(Reponse) <> "non"
DescoDev
2. Le langage VBScript
28
Un autre piège provient des conditions mal construites provoquant des boucles infinies.
Examinez l’exemple suivant et notez que la condition de cette boucle ne pourra jamais être
rencontrée.
‘********* Ce code est erroné… ne l’essayez-pas ****************’
nVar = 0
Do Until nVar > 10
Y = nVar * X
Loop
Cet exemple illustre bien le phénomène des boucles infinies. La condition ne pouvant jamais être
rencontrée, le script s’exécute éternellement et fait rapidement grimper à 100% le niveau
d’utilisation du processeur. Notez que Windows Script Host ne possède qu’une seule technique
afin de stopper les boucles infinies lorsque vous exécutez le script à l’extérieur du débogueur :
appuyez sur les touches CTRL + ALT + DEL afin d’obtenir le Gestionnaire de tâches et
localisez l’application et le processus CScript.exe ou WScript.exe afin de les stopper.
Imbrication de structures de contrôles
VBScript permet au programmeur d’imbriquer les différentes structures de contrôles afin de
donner plus de latitude à son code. L’imbrication de structures de contrôles emploie le principe dit
LIFO (Last-In, First-Out) stipulant que la dernière structure de contrôle imbriquée doit être la
première à se terminer. Voici l’exemple d’un code permettant de connaître tous les nombres
premiers compris entre 1 et 100 :
For X = 1 To 100
Premier = True
For Y = 2 To X
If (X Mod Y = 0) AND (X <> Y) Then
Premier = False
Exit For
End If
Next
Next
If Premier Then WScript.Echo X & " est un nombre premier."
CH02\NbrPremiers.vbs
Notez que chacune des structures de contrôle se termine avant que ne se termine la structure de
contrôle parent.
DescoDev
2. Le langage VBScript
29
Utilisation des fonctions
VBScript hérite de ses ancêtres Basic et Visual Basic d’une multitude de fonctions procurant une
grande flexibilité à ce langage. Ces fonctions sont intrinsèques au langage et ne nécessite donc
pas que le script référence un modèle d’objets externe tel que vous apprendrez à les utiliser dans
les prochains chapitres. Lorsque votre script invoque une fonction, votre script demande au code
qui y est contenu de s’exécuter.
Il est possible d’invoquer une fonction ou une procédure simplement en la nommant:
NomFonction
Cet appel d’une fonction met en oeuvre la syntaxe la plus simple puisque la fonction ne nécessite
pas que des paramètres d’entrée ne lui soient spécifiés. Les paramètres représentent des
informations supplémentaires que la fonctions pourrait attendre afin de préciser certains aspects
de l’appel. Ainsi, lorsque vous demandez l’exécution de la commande Format afin de formater
un disque, vous devez spécifiez la lettre du lecteur qui doit être formaté. Il s’agit là d’un
paramètre, d’une information supplémentaire nécessaire pour l’exécution de la commande. Voici
la syntaxe permettant d’invoquer une fonction ou une procédure et de préciser les paramètres
attendus par celle-ci :
NomFonction
Param1, Param2, ParamN
Remarquez que chacun des paramètres sont séparés les uns des autres par une virgule (,).
Notez également que certaines fonctions attendent des paramètres optionnels. Ainsi, si vous
spécifiez une valeur pour ces paramètres, la fonction utilisera cette valeur mais utilisera une
valeur définie par défaut à l’interne si aucune valeur n’est spécifiée pour ces paramètres.
Finalement, une fonction peut renvoyer une valeur de retour. Une valeur de retour peut être le
fruit d’un calcul ou d’une opération quelconque. Une valeur de retour peut également être une
information indiquant si la fonction s’est exécutée correctement ou si elle a échouée. Vous
retrouverez au sein du présent chapitre la signification des valeurs de retour des fonctions
intrinsèques à VBScript. Voici la syntaxe permettant d’invoquer une fonction et d’en récupérer la
valeur de retour :
MaVariable = NomFonction()
ou, dans le cas de méthodes paramétrables :
MaVariable = NomFonction(Param1, Param2, ParamN)
Dans laquelle syntaxe la valeur de retour de la méthode a été stockée au sein de la variable
MaVariable. Notez l’utilisation des parenthèses lorsque la valeur de retour de la fonction est
attendue et stockée au sein d’une variable. Votre script n’est pas obligé de récupérer les valeurs
de retour des fonctions. Lorsqu’une fonction prévoit une valeur de retour et que vous ne désirez
pas la stocker, utilisez un appel de procédure normal sans utiliser les parenthèses.
DescoDev
2. Le langage VBScript
30
Création de fonctions et procédures
Lorsque vous écrirez vos scripts, vous rencontrerez certainement des situations dans lesquelles
vous êtes forcé de répéter intégralement ou à quelques différences près un code précédemment
tapé. La première fois que cette situation se présente, c’est comique… la seconde fois, c’est
sympathique mais, ensuite, la situation devient rapidement lassante de par sa redondance. De
plus, le fait de copier un même code à plusieurs endroits peu provoquer des ennuis plus sérieux.
Si pour une raison ou une autre un code déjà copié à maints autres endroits devait être modifié,
ces mêmes modifications devraient obligatoirement être appliquées aux autres duplicata de ce
code. Le mot redondance prend alors tout son sens.
Heureusement, VBScript vous permet d’encapsuler tout code redondant au sein de fonctions ou
de procédures afin de pouvoir aisément le réutiliser ultérieurement.
Le schéma ci-contre
représente un script
au sein de lequel le
même segment de
code a été copié et
répété. Si une
modification était à
apporter au premier
segment, cette
modification devrait
également s’effectuer
sur le second
segment.
Le schéma ci-contre
représente un script
au sein de lequel un
segment de code a
été intégré au sein
d’une procédure. Si
une modification était
à apporter au code de
cette procédure, cette
modification serait
automatiquement
perceptible lors de
chacun des appels de
procédure.
Vous procéderez à l’exécution de vos procédures et fonctions personnalisées de la même
manière que celle vous permettant d’exécuter les fonctions intrinsèques à VBScript tel que
présenté précédemment.
DescoDev
2. Le langage VBScript
31
Procédures
Les procédures contiennent du code que vous pouvez réutiliser régulièrement au sein de votre
script sans avoir à le réécrire ou le copier. À la place, vous inscrivez le code redondant au sein
d’une procédure et en demandez l’exécution à chaque endroit désiré au sein de votre script.
Le code d’une procédure doit préalablement être déclaré avant de pouvoir être référencé par le
script. La déclaration d’une procédure s’effectue à l’aide de la syntaxe suivante :
Sub NomProcédure ( [ListeArguments] )
< Instructions>
End Sub
Voici un exemple au sein duquel les quatre opérations arithmétiques de base sont appliquées sur
un nombre quelconque contenu au sein de la variable N. Remarquez l’appel à la procédure
Continuer exécutée afin de confirmer l’intention de l’utilisateur de continuer l’exécution du
script.
Option Explicit
Dim N
N = 3
WScript.Echo "N + N = " & N + N
Continuer
WScript.Echo "N - N = " & N - N
Continuer
WScript.Echo "N * N = " & N * N
Continuer
WScript.Echo "N / N = " & N / N
'******************** Procédure Continuer() *****************'
Sub Continuer()
Dim Reponse
Do
Reponse = LCase(InputBox("Continuer? (o)ui, (n)on"))
Loop While (Reponse <> "o" And Reponse <> "n")
If Reponse = "n" Then WScript.Quit
End Sub
CH02\ContinuerProc.vbs
Il est possible de quitter prématurément une procédure en inscrivant simplement l’instruction
Exit Sub.
DescoDev
2. Le langage VBScript
32
Fonctions
Les fonctions contiennent du code que vous pouvez réutiliser régulièrement au sein de votre
script sans avoir à le réécrire ou le copier de manière plus flexible qu’une procédure puisque les
fonctions permettent de retourner une valeur de retour.
Le code d’une procédure doit préalablement être déclaré avant de pouvoir être référencé par le
script. La déclaration d’une procédure s’effectue à l’aide de la syntaxe suivante :
Function NomFonction ( [ListeArguments] )
< Instructions>
NomFonction = valeur
End Function
Voici un exemple au sein duquel les quatre opérations arithmétiques de base sont appliquées sur
un nombre quelconque contenu au sein de la variable N. Remarquez l’appel à la fonction
Continuer exécutée afin de confirmer l’intention de l’utilisateur de continuer l’exécution du
script.
Option Explicit
Dim N
N = 3
WScript.Echo "N + N = " & N + N
If Continuer() = False Then WScript.Quit
WScript.Echo "N - N = " & N - N
If Continuer() = False Then WScript.Quit
WScript.Echo "N * N = " & N * N
If Continuer() = False Then WScript.Quit
WScript.Echo "N / N = " & N / N
'******************** Procédure Continuer() *****************'
Function Continuer()
Dim Reponse
Do
Reponse = LCase(InputBox("Continuer? (o)ui, (n)on"))
Loop While (Reponse <> "o" And Reponse <> "n")
Continuer = (Reponse = "o")
End Function
CH02\ContinuerFunct.vbs
Il est possible de quitter prématurément une fonction en inscrivant simplement l’instruction Exit
Function.
Bref, une fonction se distingue d’une procédure par sa capacité de retourner une valeur de
retour. Notez que cette valeur de retour est précisée au sein de la fonction en assignant une
valeur au nom de la fonction :
Continuer = (Reponse = "o")
DescoDev
2. Le langage VBScript
33
Portée des variables
La portée d’une variable représente les limites au delà desquelles la variable n’est plus
accessible au sein du code. Ainsi, certaines variables seront accessibles dans l’ensemble de
votre script tandis que d’autres ne seront accessibles qu’à l’intérieure d’une procédure ou d’une
fonction. Ce concept permet au programmeur d’éviter quantité d’erreurs imprévisibles et difficiles
à diagnostiquer.
Le schéma ci-contre représente la disposition du code au sein
d’un script. Le script dans son entier peut être nommé Section
générale qui peut être sous-divisée en modules constitués de
procédures ou de fonctions.
Certaines variables ne seront accessibles qu’à l’intérieur d’une
procédure donnée tandis que d’autres variables seront
accessibles dans l’ensemble de la section générale et des
procédures la composant.
La portée d’une variable est définie par le mot-clé utilisé de la déclaration de celle-ci :
•
Les mot-clés Dim et Private déclarent une variable privée qui ne sera accessible qu’à
l’intérieur du module au sein duquel elle est déclarée. Ainsi, si la variable est déclarée au
sein d’une procédure, elle ne sera utilisable que par le code interne à cette procédure et
demeurera invisible au reste du script. Cependant, si cette variable est déclarée dans la
section générale du script, elle sera visible à l’ensemble des procédures et fonctions de
ce script.
•
Le mot-clé Public déclare une variable publique qui sera accessible au module au sein
duquel elle est déclarée et à l’ensemble des procédures et fonctions lui appartenant.
Ainsi, si cette variable est déclarée dans la section générale du script, elle sera visible à
l’ensemble des procédures et fonctions de ce script.
Le schéma ci-contre représente la déclaration de quatre
variables au sein d’un script.
Puisque déclarées au niveau de la section générale, les
variables X et Y sont accessibles dans l’ensemble du script.
Puisque déclarées au niveau d’une procédure ou d’une fonction,
les variables A et B ne sont accessibles que dans leur procédure
ou fonction respective.
Si, par exemple, la procédure ProcA tentait d’accéder à la
variable B déclarée au sein de la procédure ProcB, un message
d’erreur afficherait que la variable n’a pas été déclarée.
Cependant, la procédure ProcA peut sans encombre accéder à
la variable X déclarée au sein de la section générale du script.
De manière générale, si votre variable doit être accessible de l’ensemble des procédures et
fonctions, déclarez celle-ci au sein de la section générale du script. Autrement, déclarez vos
variables à l’intérieur des procédures au sein desquelles l’accès à cette variable est nécessaire.
DescoDev
2. Le langage VBScript
34
Passage de paramètres
Les exemples précédents de procédures et fonctions ne vous permettaient pas de préciser des
paramètres. Or, le passage de paramètres est une pratique fort utile dans l’élaboration de
procédures et de fonctions flexibles et réutilisables.
Le passage de paramètres permet à une procédure ou à une fonction de réagir différemment
selon la valeur des paramètres qu’elle a reçue. Par exemple, je peux demander à une
calculatrice d’effectuer une addition sur deux valeurs numériques 7 + 4. Cependant, je peux
demander à cette même calculatrice d’effectuer une même addition mais, cette fois, avec deux
valeurs différentes : 6 + 5. Les instructions que doit exécuter la calculatrice demeurent les
mêmes lors de l’exécution des deux opérations pourtant différentes puisque seules les valeurs
changent. Dans de telles situations, le programmeur a intérêt à créer une fonction qui, comme la
calculatrice, exécutera toujours les mêmes instructions en y modifiant seulement les valeurs.
Vous pouvez déclarer une fonction ou une procédure et spécifier qu’elle nécessite le passage de
certains paramètres afin de s’exécuter adéquatement en précisant ces paramètres entre les
parenthèses de la déclaration de la fonction ou de la procédure et en séparant les différents
paramètres par des virgules :
Function|Sub NomProcedure (Param1 [, Param2] [, ParamN])
L’exemple suivant montre une fonction qui permettrait de prendre deux nombres et d’en retourner
la somme :
Function Addition (Nbr1, Nbr2)
Addition = Nbr1 + Nbr2
End Function
Cette fonction pourrait maintenant être exécutée au sein du script à l’aide de l’instruction
suivante :
Dim Somme
Somme = Addition(2, 4)
‘ Somme vaut désormais 6.
DescoDev
2. Le langage VBScript
35
Utilisation de tableaux
Le code suivant procède à la déclaration de cinq variables contenant des valeurs numériques :
Dim Chiffre1, Chiffre2, Chiffre3, Chiffre4, Chiffre5
Pour pouvoir calculer la moyenne de ces variables, le code devrait ressembler au suivant :
Moyenne = (Chiffre1 + Chiffre2 + Chiffre3 + Chiffre4 + Chiffre5) \ 5
Imaginez maintenant le code nécessaire pour calculer cent valeurs numériques ou, pire encore,
un nombre indéterminé de valeurs numériques. C’est à ce moment que les tableaux viennent à la
rescousse.
Un tableau est simplement un ensemble de variables du même type se succédant au sein de
l’espace mémoire et accessible sous la même appellation. Chacun des éléments du tableau est
identifié par son index. L’index d’un élément correspond à la position ordinale de l’élément au
sein du tableau. L’illustration suivante montre la mémoire occupée par un tableau de cinq
éléments contenant chacun un prénom :
Tableau
Index
Contenu
0
"Luc"
1
"Berthe"
2
"Yannick"
3
"Mario"
4
"Jeanne"
Ainsi, si on affiche la valeur de l’élément 2, nous obtiendrons "Yannick" :
Prenom = Tableau(2)
MsgBox Prenom
'Affiche "Yannick"
Le principal avantage d’un tableau demeure indéniablement la simplicité du code nécessaire pour
parcourir l’ensemble de ses éléments :
Dim N
For N = 0 To 4
Prenom = Tableau(N)
MsgBox Prenom
Next
Les tableaux demeurent donc les meilleures solutions lorsque votre code nécessite le stockage
d’un grand nombre de valeurs ou un nombre indéterminé de valeurs.
DescoDev
2. Le langage VBScript
36
Déclaration et utilisation de tableaux
Le tableau est le mode de stockage vectoriel de base prévu par VBScript. Un tableau est déclaré
en précisant entre parenthèses l’index du dernier élément désiré :
Dim MonTableau(9)
'Déclare un tableau de 10 éléments, de 0 à 9
Les valeurs sont ensuite assignées individuellement à chacun des éléments du tableau en
précisant entre parenthèses l’index de l’élément que la valeur doit être assignée.
Dim MonTableau(9)
MonTableau(0) = "Luc"
MonTableau(1) = "Berthe"
Etc…
L’exemple suivant assigne des valeurs de 1 à 100 aux différents éléments d’un tableau :
Dim Nombres(99), N
For N = 0 To 99
Nombres(N) = N + 1
Next
L’exemple suivant assigne les lettres de ‘A’ à ‘Z’ aux différents éléments d’un tableau :
Dim Lettres(25), N
For N = 0 To 25
Lettres(N) = Chr(N + 65)
Next
'65 = Caractère ASCII du 'A'
L’exemple suivant invite l’utilisateur à saisir dix nombres et en calcule ensuite la moyenne :
Dim Nombres, N, Total
For N = 0 To 9
Nombres(N) = CInt(InputBox("Entrez le nombre " & N + 1))
Next
Total = 0
For N = 0 To 9
Total = Total + Nombres(N)
Next
MsgBox "La moyenne est : " & Total / 10
DescoDev
2. Le langage VBScript
37
Un tableau peut également posséder un nombre indéterminé d’éléments. Ce type de tableau,
nommé tableau dynamique, est utile lorsque le code ne peut connaître d’avance le nombre
d’éléments qui seront nécessaires. Pour créer un tableau dynamique, il est nécessaire d’omettre
l’index de l’élément supérieur à la déclaration du tableau :
Dim MonTableau()
'Déclare un tableau dynamique
Cependant, ce tableau n’est pas utilisable puisqu’il est vide et est considéré comme contenant
aucun élément. Toute forme d’accès à un des éléments de ce tableau provoquerait
immanquablement une erreur. Le message d’erreur "Indice en dehors de la plage" s’affichera
alors. Il est donc nécessaire de redimensionner le tableau avant de l’utiliser en utilisant le mot-clé
réservé Redim et en précisant les nouvelles dimensions du tableau.
Dim MonTableau()
Redim MonTableau(1) 'Redimensionne le tableau à 2 éléments, 0 et 1
Cette technique possède cependant le désavantage d’effacer le contenu de tout élément existant
au sein du tableau.
Dim MonTableau()
Redim MonTableau(1)
MonTableau(0) = "Luc"
MonTableau(1) = "Berthe"
Redim MonTableau(9)
MsgBox MonTableau(0) 'Affiche "" puisque Redim en a effacé le
'contenu.
Si votre code nécessite cependant la conservation des valeurs existantes, le redimensionnement
doit inclure le mot-clé Preserve. Ce dernier assure la conservation du contenu existant.
Dim MonTableau()
Redim MonTableau(1)
MonTableau(0) = "Luc"
MonTableau(1) = "Berthe"
Redim Preserve MonTableau(9)
MsgBox MonTableau(0)
'Affiche "Luc".
Maintenant que votre code peut créer des tableaux dynamiques, il pourrait lui arriver de ne pas
savoir exactement combien d’éléments constituent le tableau. Cette information peut être
récupérée à l’aide de la fonction UBound qui retourne l’index du dernier élément du tableau.
L’exemple suivant parcours et affiche l’ensemble des éléments d’un tableau sans en connaître
préalablement les dimensions :
For N = 0 To UBound(MonTableau)
MsgBox MonTableau(N)
Next
DescoDev
2. Le langage VBScript
38
Objets, propriétés et méthodes
Les langages de script de Windows Script Host utilisent des objets prédéfinis afin de pouvoir
exécuter un ensemble de fonctionnalités. Avant de pouvoir utiliser ces objets au sein de vos
scripts, vous devez impérativement comprendre certains concepts associés à la programmation
orientée-objets.
Objets
Un objet peut être perçu comme un lot de fonctionnalités regroupés thématiquement sous un
même nom. L’objet contient le code nécessaire à l’exécution des fonctionnalités que vous
utiliserez mais ce code ne vous est pas accessible : vous pouvez l’utiliser mais vous ne pouvez
pas le voir. Autre analogie, lorsque vous utilisez la commande format afin de formater votre
disque dur, vous utilisez une fonctionnalité de laquelle il vous est impossible d’en consulter le
code.
Un ou plusieurs objets ainsi que ses fonctionnalités associées sont généralement compilés en
fichiers binaires et peuvent être du type Dynamic Link Librairie (DLL) ou ActiveX Control (OCX).
Puisque les objets regroupent des fonctionnalités de manière thématique, la première étape
avant d’écrire une instruction au sein d’un script est de connaître l’objet possédant les
fonctionnalités que l’on désire utiliser. Les modèles d’objets agissent en frais de documentation
permettant de connaître la liste d’objets disponibles au sein d’un fichier binaire. Lorsque vous
avez localisé l’objet qui devra être utilisé, vous pouvez prendre connaissance de l’ensemble de
ses fonctionnalités qui vous sont exposés sous l’appellation de Méthodes et de Propriétés.
DescoDev
2. Le langage VBScript
39
Méthodes
Les objets exposent leurs fonctionnalités à votre script à l’aide de leurs méthodes. Lorsque votre
script invoque une méthode d’un objet, votre script demande à cet objet d’exécuter une de ses
fonctionnalités.
Voici une première syntaxe permettant d’invoquer une méthode :
Objet.Méthode
Remarquez que le point (.) est utilisé afin de séparer le nom de l’objet du nom de sa méthode à
invoquer. Cet appel d’une méthode met en oeuvre la syntaxe la plus simple puisque la méthode
ne nécessite pas que des paramètres d’entrée ne lui soient spécifiés. Les paramètres
représentent des informations supplémentaires que la méthode pourrait attendre afin de préciser
certains aspects de l’appel. Ainsi, lorsque vous demandez l’exécution de la commande Format
afin de formater un disque, vous devez spécifiez la lettre du lecteur qui doit être formaté. Il s’agit
là d’un paramètre, d’une information supplémentaire nécessaire pour l’exécution de la
commande. Voici la syntaxe permettant d’invoquer une méthode et de préciser les paramètres
attendus par celle-ci :
Objet.Méthode
Param1, Param2, ParamN
Remarquez que chacun des paramètres sont séparés les uns des autres par une virgule (,).
Notez également que certaines fonctions attendent des paramètres optionnels. Ainsi, si vous
spécifiez une valeur pour ces paramètres, la méthode utilisera cette valeur mais utilisera une
valeur par défaut si aucune valeur n’est spécifiée pour ces paramètres.
Finalement, une méthode peut renvoyer une valeur de retour. Une valeur de retour peut être le
fruit d’un calcul ou d’une opération quelconque. Une valeur de retour peut également être une
information indiquant si la méthode s’est exécutée correctement ou si elle a échouée. Vous
retrouverez au sein de la documentation d’un objet la signification des valeurs de retour de ses
méthodes. Voici la syntaxe permettant d’invoquer une méthode et d’en récupérer la valeur de
retour :
MaVariable = Objet.Méthode()
ou, dans le cas de méthodes paramétrables :
MaVariable = Objet.Méthode(Param1, Param2, ParamN)
Dans laquelle syntaxe la valeur de retour de la méthode a été stockée au sein de la variable
MaVariable. Notez l’utilisation des parenthèses lorsque la valeur de retour de la méthode est
attendue et stockée au sein d’une variable. Votre script n’est pas obligé de récupérer les valeurs
de retour des méthodes. Si une méthode prévoit une valeur de retour et que vous ne désirez pas
la stocker, utilisez un appel de méthode normal sans utilisation des parenthèses.
DescoDev
2. Le langage VBScript
40
Propriétés
Les objets exposent leurs données et leurs caractéristiques à votre script à l’aide de leurs
propriétés. Ainsi, pour pouvoir accéder aux données et caractéristiques d’un objet, vous devez
savoir comment lire et écrire au sein d’une propriété de cet objet. Voici la syntaxe permettant de
lire la valeur d’une propriété d’un objet :
MaVariable = Objet.Propriété
Par laquelle syntaxe la valeur de la Propriété Propriété de l’objet Objet a été stockée au sein
de la variable MaVariable.
Voici la syntaxe permettant d’écrire la valeur d’une propriété d’un objet :
Objet.Propriété = Valeur
Par laquelle syntaxe la valeur Valeur a été stockée au sein de la propriété Propriété de
l’objet Objet. La valeur peut être constituée de :
•
Un littéral
Vous pouvez assigner une valeur littérale à une propriété telle une valeur numérique
comme le nombre 16 ou une chaîne de caractères comme "chien".
•
La propriété d’un autre objet
Vous pouvez assigner la valeur d’une variable ou d’une propriété d’un autre objet.
Objet1.Propriété = Objet2.Propriété
•
Une expression
Vous pouvez assigner une expression comme 12 + 4 ou "chien" concaténé avec "chat".
Le résultat final de cette expression sera d’abord évalué par le moteur de script avant
d’être assigné à la propriété.
•
La valeur de retour renvoyée par une méthode
Vous pouvez assigner la valeur de retour d’une méthode. La méthode sera d’abord
exécutée par le moteur de script avant d’assigner sa valeur de retour à la propriété.
Objet.Propriété = Méthode([arg])
DescoDev
2. Le langage VBScript
41
Voici un simple exemple de l’utilisation de méthodes et de propriétés de différents objets du
modèle d’objets de Window Script Host. Voyez le chapitre 3 afin de consulter la documentation
complète au sujet de ce modèle d’objets.
Option Explicit
Dim objNet
Set objNet = WScript.CreateObject("WScript.Network")
Domaine = objNet.UserDomain
Utilisateur = objNet.UserName
Ordinateur = objNet.ComputerName
WScript.Echo "Bienvenue " & Domaine & "\" & Utilisateur & "."
WScript.Echo "Vous utilisez l'ordinateur " & Ordinateur & "."
CH02\Utilisateur.vbs
Notez d’abord l’utilisation des parenthèses lors de l’appel de la méthode CreateObject
puisque la valeur de retour est attendue par le script et stockée au sein de la variable objNet.
Notez ensuite l’assignation de différentes propriétés de l’objet objNet aux différentes variables
Domaine, Utilisateur et Ordinateur.
Finalement, notez les appels de la méthode Echo de l’objet WScript qui ne gèrent pas les
valeurs de retour de cette méthode. Ainsi, la syntaxe ne prévoit pas de parenthèses pour ces
appels de méthodes.
DescoDev
2. Le langage VBScript
42
Création et destruction des objets
Lorsqu’un programmeur conçoit un objet afin que vous puissiez le réutiliser au sein de vos
scripts, celui-ci procède à la création de ce qu’on appelle une classe. Une classe est un modèle,
un plan, un blueprint d’un objet. Une classe défini le comportement d’un objet, la liste des
propriétés et des méthodes exposées par cet objet ainsi que le code qui devra être exécuté lors
de l’invocation de l’une des ces méthodes ou lors de l’utilisation de l’une de ces propriétés. Par
contre, avant d’être adéquatement utilisée au sein de votre script, vous devez créer une instance
de cette classe en procédant à ce que l’on appelle l’instanciation d’un objet.
Afin de bien comprendre ces concepts plutôt abstraits, comparez-les à la construction d’une
maison : l’architecte conçoit le plan d’une maison. Ce plan régi la construction éventuelle de
maisons qui seront tous semblables si elles suivent à la lettre le plan de l’architecte. Cependant,
le plan n’est pas habitable puisque le plan n’est pas la maison. Au même titre, la classe n’est pas
l’objet.
Avant de pouvoir habiter la maison, vous devez en construire une instance selon le plan. C’est
l’étape de l’instanciation d’un objet, c’est-à-dire la création d’un objet selon le plan défini par la
classe. Maintenant, si vous décidez de construire plusieurs maisons identiques selon le même
plan et que vous décidez d’en repeindre une en rouge, les autres maisons ne seront pas
affectées et demeureront de la même couleur originale. Le même concept s’applique aux objets :
si vous procédez à plusieurs instances d’une même classe et que vous modifiez les propriétés
d’un de ces objets, les autres instances n’en seront aucunement affectées.
Création d’un objet
Vous devez instancier un objet avant de pouvoir en utiliser les méthodes et propriétés. Vous
procédez à l’instanciation d’un objet au sein de vos scripts à l’aide de l’instruction
CreateObject. Cette instruction est intrinsèque au langage VBScript.
Set Variable_Objet = CreateObject(Objet_ProgID)
Par exemple, le script suivant procède à l’instanciation d’un objet de type Network :
Set objNet = CreateObject("WScript.Network")
L’objet est désormais utilisable au sein de votre script sous l’appellation objNet. L’objet créé à
partir de la classe Network possède entre autres la méthode MapNetworkDrive permettant de
connecter un lecteur réseau :
Option Explicit
Dim objNet
Set objNet = CreateObject("WScript.Network")
objNet.MapNetworkDrive "Z:", "\\serveur\partage"
WScript.Echo "Le lecteur Z: est connecté!"
CH02\map.vbs
L’objet WScript est un objet intrinsèque au modèle d’objets de Windows Script Host et n’a pas besoin d’être
instancié avant d’être utilisé. Une instance de cet objet est omniprésente dans tout les scripts et, à vrai dire,
cet objet ne peut tout simplement pas être instancié et apporte l’exception à la règle.
DescoDev
2. Le langage VBScript
43
Destruction d’un objet
Lorsqu’un objet est créé à l’aide de l’instruction CreateObject, la structure de la classe
correspondante est chargée en mémoire. Lorsque l’objet n’est plus utilisé, il faut rendre au
système d’exploitation l’espace mémoire consommé par la création des différents objets. Le
script procède alors à la destruction de l’objet. Cet objet devient alors inutilisable et il devient
alors impossible d’en utiliser ni ses méthodes ni ses propriétés. On procède à la destruction
explicite d’un objet comme suit :
Set Variable_Objet = Nothing
Notez cependant que tout objet créé par un script est automatiquement détruit par Windows
Script Host lors de la fin de l’exécution de ce script. La suppression explicite des objets à l’aide
du mot-clé Nothing est cependant recommandée en tant que bonne habitude de
programmation structurée.
La liste des objets utilisables sur votre ordinateur peut être connue en consultant les différentes sous-clés de
la clé HKEY_CLASSES_ROOT de votre base de registres. Les objets sont listés après la liste des associations
d’extensions de fichier dont les noms de clés sont précédés d’un point ( . ). Chacun des objets utilisables sont
listés sous le format NomLibrairie.NomObjet.
Utilisation d’un objet existant
Il est possible de référencer un objet existant à l’aide de l’instruction GetObject. Aucune
nouvelle instance d’une classe n’est créée mais il est alors possible d’obtenir une référence sur
un objet existant.
Set Variable_Objet = GetObject(Fichier)
Par exemple, le script suivant récupère une référence sur un objet de type Winword.Document
correspondant au fichier « c:\document.doc » :
Set objDoc = GetObject("c:\document.doc")
L’objet est désormais utilisable au sein de votre script sous l’appellation objDoc. L’exemple
suivant provoque l’affichage du fichier « c:\document.doc » au sein de Word si ce fichier existe :
Set objDoc = GetObject("c:\document.doc")
objDoc.Parent.Visible = True
CH02\Document.vbs
DescoDev
2. Le langage VBScript
44
Gestion des erreurs
Pour diverses raisons, votre code peut parfois générer des erreurs soulevées par le système.
Une erreur peut survenir lorsque votre script tente d’accéder à un lecteur temporairement
inaccessible (un lecteur de disquettes ne possédant pas de disquette), lorsque votre script tente
d’exécuter une instruction non-conforme (division par zéro), lorsque votre script tente d’accéder à
un chemin réseau introuvable, etc.
Cependant, il ne faut pas nécessairement percevoir les erreurs comme étant de méchantes bêtes
surgissant toujours du noir au moment le plus inopportun. Les erreurs sont souvent des
messages prévenant le programmeur d’une situation quelconque et pas forcément désastreuse.
Par exemple, le script suivant s’exécute bien la première fois mais génère une erreur dès qu’il est
ré-exécuté :
Option Explicit
Dim objNet
Set objNet = CreateObject("WScript.Network")
objNet.MapNetworkDrive "Z:", "\\serveur\partage"
MsgBox "Le lecteur Z: est connecté!", vbInformation
CH02\map.vbs
Ce script génère une erreur lorsqu’il est ré-exécuté tout simplement parce que le lecteur "z:" est
déjà connecté à un chemin réseau et ne peut être utilisé une seconde fois. Est-ce pour autant
tragique ? Il suffit au programmeur de prévoir ces situations au sein desquelles des erreurs
peuvent survenir et de les traiter avec une attention particulière.
L’instruction On Error Resume Next
VBScript prévoit une instruction permettant au code de faire fît des erreurs pouvant survenir au
sein du script. Si, considérant l’exemple précédant, l’instruction MapNetworkDrive génère une
erreur puisque le lecteur a déjà été connecté, l’instruction On Error Resume Next précisera à
VBScript de ne pas en tenir compte et de passer outre.
Option Explicit
Dim objNet
Set objNet = CreateObject("WScript.Network")
On Error Resume Next
objNet.MapNetworkDrive "Z:", "\\serveur\partage"
MsgBox "Le lecteur Z: est connecté!", vbInformation
DescoDev
2. Le langage VBScript
45
L’objet Err
Maintenant, avec une telle instruction, il est désormais possible d’exécuter un script au grand
complet sans qu’aucune erreur ne soit jamais générée. Youppi ! Comme il a été précisé
précédemment, les erreurs ne doivent pas être perçues comme des événements tragiques mais
plutôt comme des messages qu’il suffit de traiter adéquatement. Ainsi, il ne suffit pas de spécifier
à l’hôte de script de passer outre les erreurs mais il demeure plus sage de vérifier si une erreur
est survenue et de réagir en conséquence.
L’objet Err représente l’erreur produite par la dernière instruction exécutée et vous permet d’en
connaître la source, le numéro, la description, etc. En testant adéquatement l’objet Err à l’aide
d’une simple structure If, il est possible de savoir si l’instruction précédemment exécutée a
générée une erreur ou non.
Option Explicit
Dim objNet
Set objNet = CreateObject("WScript.Network")
On Error Resume Next
objNet.MapNetworkDrive "Z:", "\\serveur\partage"
If Err.Number Then
MsgBox "Le lecteur Z: était déjà connecté!", vbExclamation
Else
MsgBox "Le lecteur Z: est connecté!", vbInformation
End If
Notez que l’exploit est réalisable seulement si l’instruction On Error Resume Next a été activé
sinon l’hôte de script interrompra l’exécution du script sur la ligne de code générant une erreur.
Ainsi, si la propriété Number de l’objet Err retourne zéro (0), cela signifie qu’aucune erreur n’a
été générée par la dernière instruction générée. Sinon, la propriété Err.Number possédera
comme valeur le numéro de l’erreur correspondante. L’objet Err expose les membres
importants suivants :
Propriété
Number
Source
Description
Clear
Description
Retourne le numéro de la dernière erreur survenue. Retourne zéro (0) si la
dernière instruction n’a générée aucune erreur.
Retourne le nom de la librairie ayant générée la dernière erreur survenue.
Retourne le nom de la description associé à la dernière erreur survenue.
Procède à la suppression de toute information concernant la dernière erreur
survenue.
DescoDev
2. Le langage VBScript
46
L’instruction On Error Goto 0
L’instruction On Error Goto 0 permet d’annuler tout traitement des erreurs. Ainsi, si une
erreur survient après cette instruction, l’hôte interrompra le script et générera un message
d’erreur. Ce comportement de l’hôte est souhaitable puisque nous désirons connaître les erreurs
non-gérées que pourrait générer notre script afin de le rendre le plus parfait que possible.
Option Explicit
Dim objNet
Set objNet = CreateObject("WScript.Network")
On Error Resume Next
objNet.MapNetworkDrive "Z:", "\\serveur\partage"
If Err.Number Then
MsgBox "Le lecteur Z: était déjà connecté à un chemin d
réseau!", vbExclamation
Else
MsgBox "Le lecteur Z: est connecté!", vbInformation
End If
On Error Goto 0
Set objNet = Nothing
CH02\map avec traitement des erreurs.vbs
DescoDev
3. Les fonctions VBScript
47
3
Les fonctions VBScript
DescoDev
3. Les fonctions VBScript
48
3. Les fonctions VBScript
VBScript hérite de ses ancêtres Basic et Visual Basic d’une multitude de fonctions procurant une
grande flexibilité à ce langage. Ces fonctions sont intrinsèques au langage et ne nécessitent donc
pas que le script référence un modèle d’objets externe tel que vous apprendrez à les utiliser dans
les prochains chapitres.
Fonctions d’interactivité avec l’utilisateur
VBScript prévoit quelques fonctions permettant l’interaction avec l’utilisateur. La première,
MsgBox, permet d’afficher de l’information à l’utilisateur tandis que la seconde, InputBox,
permet de saisir de l’information de la part de l’utilisateur.
Fonction
Description
Exemple
Beep
Génère un signal sonore.
Affiche une boîte de message à
l’utilisateur.
Affiche une boîte d’invite à l’utilisateur et
retourne la valeur saisie par celui-ci.
Beep
MsgBox
InputBox
MsgBox "Allô la planète"
strR = InputBox("Entrez " d
& "un nombre entre 1 et 10")
La fonction MsgBox permet de spécifier le texte à afficher au sein de la boîte de dialogue mais
également les boutons et icônes à afficher ainsi que le titre que devra arborer la boîte de
dialogue selon le prototype suivant :
MsgBox ( Message [, Boutons] [,Titre] )
Le paramètre Boutons peut prendre l’une des valeurs constantes suivantes :
Constante
Valeur
Description
vbOkOnly
0
Affiche le bouton Ok seulement.
vbOkCancel
1
Affiche les boutons Ok et Annuler.
vbAbortRetryIgnore
2
Affiche les boutons Abandonner, Réessayer et Ignorer.
vbYesNoCancel
3
Affiche les boutons Oui, Non et Annuler.
vbYesNo
4
Affiche les boutons Oui et Annuler.
vbRetryCancel
5
Affiche les boutons Réessayer et Annuler.
vbCritical
16
Affiche l’icône correspondant aux erreurs critiques.
vbQuestion
32
Affiche l’icône correspondant aux questions.
vbExclamation
48
Affiche l’icône correspondant aux avertissements.
vbInformation
64
Affiche l’icône correspondant aux informations.
vbDefaultButton1
0
Sélectionne par défaut le premier bouton.
vbDefaultButton2
256
Sélectionne par défaut le second bouton.
vbDefaultButton3
512
Sélectionne par défaut le troisième bouton.
vbDefaultButton4
768
Sélectionne par défaut le quatrième bouton.
DescoDev
3. Les fonctions VBScript
49
Plusieurs valeurs constantes peuvent être combinées à l’aide de l’opérateur + comme le montre
l’exemple suivant :
MsgBox "Désirez-vous interrompre le processus ?", d
vbYesNo + vbQuestion + vbDefaultButton2, "Processus"
Ce qui produit le résultat ci-contre. Notez le titre de la
boîte de dialogue, les deux boutons Oui et Non mais
notez plus particulièrement que le focus a été déposé par
défaut sur le second bouton.
On tentera toujours de déposer le focus par défaut sur le
bouton dont la réponse est la moins dangereuse pour
l’utilisateur.
Maintenant, reste à récupérer la réponse de l’utilisateur à une telle question. La fonction MsgBox
permet de connaître la réponse de l’utilisateur en testant la valeur retournée par cette fonction :
Constante
Valeur
Description
VbOk
1
L’utilisateur a appuyé sur le bouton Ok.
vbCancel
2
L’utilisateur a appuyé sur le bouton Annuler.
vbAbort
3
L’utilisateur a appuyé sur le bouton Abandonner.
vbRetry
4
L’utilisateur a appuyé sur le bouton Réessayer.
vbIgnore
5
L’utilisateur a appuyé sur le bouton Ignorer.
VbYes
6
L’utilisateur a appuyé sur le bouton Oui.
VbNo
7
L’utilisateur a appuyé sur le bouton Non.
Voici un exemple au sein de lequel l’utilisateur est invité à
spécifier s’il désire terminer un processus quelconque ou s’il
désire continuer à l’aide de la boîte de dialogue ci-contre.
Si l’utilisateur appuie sur le bouton Oui, le script s’arrête à l’aide
de l’instruction Exit Do vue précédemment.
Do
If MsgBox ("Continuer ?", vbYesNo + vbQuestion) = vbNo Then
Exit Do
End If
MsgBox "Alors on recommence…", vbInformation
Loop
MsgBox "C’est ici que cela se termine!", vbInformation
CH02\Recommencer.vbs
DescoDev
3. Les fonctions VBScript
50
La fonction InputBox permet de spécifier le texte à afficher au sein de la boîte de dialogue mais
également le titre que devra arborer la boîte de dialogue et la valeur par défaut inscrite au sein de
la zone de saisie selon le prototype suivant :
InputBox ( Message [,Titre] [,Defaut] [,xPos] [,yPos] )
Le paramètre optionnel Defaut permet de préciser la saisie par défaut affichée à l’utilisateur :
Dim strReponse
strReponse = InputBox("Entrez votre nom",
, "Votre nom")
Ce qui produit le résultat ci-contre.
Remarquez que du texte est déjà
présent dans la zone de saisie et qu’il
ne reste à l’utilisateur qu’à le modifier.
Les paramètres optionnels xPos et yPos permettent de préciser la position exprimée en pixels à
laquelle la boîte de saisie devra s’afficher. La boîte s’affiche au centre de l’écran si aucune valeur
pour ces paramètres n’est précisée.
Maintenant, reste à récupérer la réponse de l’utilisateur. La fonction InputBox permet de
connaître la réponse de l’utilisateur en récupérant la valeur retournée par cette fonction. Dans
l’exemple suivant, l’utilisateur est invité à préciser sa date de naissance et cette information est
ultérieurement stockée dans la variable dNaissance. Ensuite, cette variable peut être testée afin
d’en assurer la validité. L’exemple suivant recommence la saisie de la date de naissance si
l’information saisie par l’utilisateur est invalide :
Dim dNaissance
'********************************************************************'
'* S'assure de récupérer une date valide.
*'
'********************************************************************'
Do
dNaissance = InputBox("Entrez votre date de naissance." & d
& vbCrLf & vbCrLf & "Spécifiez la date dans le format " d
& " yyyy-mm-dd")
Loop Until IsDate(dNaissance)
Notez que la fonction InputBox retourne une chaîne vide "" lorsque l’utilisateur appuie sur le
bouton Annuler de la boîte de saisie.
DescoDev
3. Les fonctions VBScript
51
Fonctions de date et de temps
VBScript prévoit une pluralité de fonctions permettant la manipulation aisée des données de type
date. Voici la liste complète des fonctions directement reliées au traitement des dates et heures :
Fonction
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Description
Retourne la date du jour courant
selon la date système.
Retourne une date résultant de
l’addition d’un nombre de jour, de
mois ou d’années spécifié. La fonction
soustrait si la valeur spécifiée est
négative.
Retourne le nombre de secondes,
minutes, heures, jours, mois ou
d’années espaçant deux dates
spécifiées.
Retourne une partie spécifique de la
date spécifiée. Peut être le jour, le
mois, etc.
Retourne une date en format Date à
partir d’informations en format sériel.
Retourne une date en format Date à
partir d’informations spécifiées en
format String.
Exemple
MsgBox "Nous sommes le " d
& Date()
Dim dt1, dt2
dt1 = Today()
dt2 = DateAdd("d",15, dt1)
Dim dt1, dt2
dt1 = #15-03-2002#
dt2 = DateDiff("m",dt1,Date())
Dim nMois, dA
dA = Today()
nMois =DatePart(dA, "m")
'Retourne le mois
MsgBox DateSerial(1975, 11, 3)
'Donne "3 novembre 1975"
Dim dtA
dtA = DateValue("1/31/2000")
Dim dDate, dJour
dDate = Date()
dJour = Day(dDate)
Dim dHre, nHeure
dHre = Time()
nHeure = Hour(dHre)
Dim dHre, nMinute
dHre = Time()
nMinute = Hour(dHre)
Dim dDate, dMois
dDate = Date()
dMois = Month(dDate)
Dim dDate, dMois
dDate = Date()
dMois = Month(dDate)
MsgBox "Nous sommes au mois "
& MonthName(dMois)
Day
Retourne le numéro du jour contenu
au sein d’une expression spécifiée.
Hour
Retourne les heures contenues au
sein d’une expression spécifiée.
Minute
Retourne les minutes contenues au
sein d’une expression spécifiée.
Month
Retourne le numéro du mois (entre 1
et 12) contenu au sein d’une
expression spécifiée.
MonthName
Retourne le nom du mois
correspondant au numéro de mois
spécifié.
Now
Retourne la date du jour courant
et l’heure courante selon les date et
heure systèmes.
MsgBox "Date et heure: " d
& Now()
Second
Retourne les secondes contenues au
sein d’une expression spécifiée.
Dim dHre, nSeconde
dHre = Time()
nSeconde = Second(dHre)
Time
TimeSerial
Retourne l’heure courante selon
l’heure système.
Retourne une date en format Date à
partir d’informations en format sériel.
MsgBox "Il est " & Time()
MsgBox TimeSerial(23, 75, 0)
'"1/2/0001 12:15:00 AM"
DescoDev
3. Les fonctions VBScript
TimeValue
Retourne une date en format Date à
partir d’informations spécifiées en
format String.
Retourne le numéro du jour de la
semaine (entre 1 et 7) contenu au
sein d’une expression spécifiée.
52
Dim dtA
dtA = TimeValue("4:35:17 PM")
Dim dDate, dJour
dDate = Date()
dJour = Weekday(dDate)
Dim dDate, dJour
dDate = Date()
Retourne le nom du jour de la
dJour = Weekday(dDate)
semaine
correspondant
au
numéro
de
WeekdayName
MsgBox "Nous sommes " d
jour spécifié.
& WeekdayName(dJour)
Dim dDate, nAnnee
dDate = Date()
Retourne l’année contenu au sein
Year
d’une expression spécifiée.
MsgBox "Nous sommes en " d
& "l’an " & Year(dDate)
Weekday
Le code suivant permet de préciser le temps écoulé depuis la naissance de l’utilisateur et la date
courante.
Option Explicit
Dim dNaissance, dDiff, nJours, strDate
'********************************************************************'
'* S'assure d'abord de récupérer une date valide.
*'
'********************************************************************'
Do
dNaissance = InputBox("Entrez votre date de naissance." & d
& vbCrLf & vbCrLf & "Spécifiez la date dans le format " d
& " yyyy-mm-dd")
Loop Until IsDate(dNaissance)
'********************************************************************'
'* Calcule le nombre de mois séparant la date de naissance
*'
'********************************************************************'
dDiff = DateDiff("m", dNaissance, Date())
'********************************************************************'
'* Calcule le nombre de jours restants
*'
'********************************************************************'
nJours = DateDiff("d", DateAdd("m", dDiff, dNaissance), Date())
'********************************************************************'
'* Affiche le résultat à l'utilisateur
*'
'********************************************************************'
strDate = WeekdayName(Weekday(dNaissance)) & " le " & Day(dNaissance)d
& " " & MonthName(Month(dNaissance)) & " " & Year(dNaissance)
MsgBox "Si vous êtes né(e) " & strDate & " vous avez " & dDiff \ 12 d
& " ans, " & dDiff Mod 12 & " mois et " & nJours & " jours."
CH03\Naissance.vbs
DescoDev
3. Les fonctions VBScript
53
Fonctions de manipulation des chaînes de caractères
VBScript dispose de plusieurs fonctions permettant de manipuler les chaînes de caractères.
Cependant, avant de commencer, il peut être important de distinguer les caractères ASCII des
caractères Unicode.
Autrefois, les chaînes de caractères étaient constituées de caractères codées sur 8 bits
regroupés arbitrairement au sein d’une table dite ASCII. Selon cette table, les lettres majuscules
occupaient les positions 65 à 90 (A à Z), les lettre minuscules occupaient les positions 97 à 122
(a à z), les nombres occupaient les positions 48 à 57 (0 à 9) et les autres symboles occupaient
diverses autres positions. La valeur ordinale des caractères était et est toujours reconnu
internationalement pour les caractères de 0 à 127 dont la table d’association est inscrite cidessous. La valeur des caractères supplémentaires étaient alors attribuée selon le système
d’exploitation, DOS ou Windows.
DescoDev
3. Les fonctions VBScript
54
Avec les années 90 et l’avènement de l’internet et l’internationalisation des communications
informatiques, la codification ASCII des caractères s’est avérée désuète puisqu’elle ne savait pas
intégrer les caractères des différents langages internationaux tels l’arabe et le chinois. Un
consortium de fabricants mis alors au point la codification Unicode maintenant reconnue
internationalement. Cette nouvelle codification code les caractères sur 16 bits et permet jusqu’à
65536 caractères différents. Visual Basic s’est adapté à cette nouvelle codification et certaines de
ses fonctions natives de traitement des chaînes de caractères ont été adaptées afin de traiter
cette nouvelle approche de la codification des caractères. Notez donc que l’ensemble des
fonctions de traitement des chaînes de caractères de VBScript ont été prévues pour traiter des
caractères ASCII codés sur 8 bits mais que certaines fonctions prévoient l’utilisation de
caractères Unicode codés sur 16 bits. Ces dernières sont explicitement identifiées à l’aide d’un W
majuscule (pour Wide Unicode).
Examinons ces fonctions de traitement des chaînes de caractères :
Fonction
Asc
Chr
Filter
FormatCurrency
Description
Retourne la valeur ASCII d’un caractère
spécifié. Si plusieurs caractères sont
spécifiés, le premier seulement sera
considéré.
Retourne le caractère correspondant à
la valeur ASCII spécifiée.
Retourne un tableau indexé à zéro
contenant les sous-éléments de la
chaîne de caractères spécifiée selon un
critère de filtre.
Retourne en format monétaire
l’expression spécifiée.
Retourne en format date l’expression
FormatDateTime
spécifiée.
FormatNumber
Retourne en format numérique
l’expression spécifiée.
FormatPercent
Retourne en pourcentage l’expression
spécifiée où 1 vaut 100%.
InStr
InStrRev
LCase
Retourne la position à laquelle une
expression spécifiée est trouvée au sein
d’une chaîne de caractère spécifiée. La
fonction retourne 0 si l’expression n’a pu
être trouvée.
Retourne la position à laquelle une
expression spécifiée est trouvée au sein
d’une chaîne de caractère spécifiée en
partant de la fin de celle-ci. La fonction
retourne 0 si l’expression n’a pu être
trouvée.
Retourne en minuscules la chaîne de
caractères spécifiée.
Exemple
Dim C
C = Asc("A")
‘ C vaut 65
Dim C
C = Chr(65)
‘ C vaut "A"
Dim C1() As String
Dim C2() As String
C2 = Filter(C1, "Allo", True)
Dim stArgent
stArgent = FormatCurrency(12.25)
Dim stDate
stDate = FormatDateTime(Now(),
vbLongDate)
Dim Prix, N
N = 5.6
Prix = FormatNumber(N, 2)
'Retourne 5.60
Dim stPcnt
stPcnt = FormatPercent(.85)
Dim nPosition, St
St = "Allo"
nPosition = InStr(st, "o")
Dim nPos, St
St = "Allo"
nPos = InStrRev(st, "o")
Dim St1, St2
St1 = "Une phrase"
St2 = LCase(St1)
DescoDev
3. Les fonctions VBScript
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
StrComp
StrReverse
Trim
UCase
Retourne les n premiers caractères
d’une chaîne de caractères selon le
nombre de caractères spécifié.
Retourne le nombre de caractères
constituant la chaîne de caractères
spécifiée.
Retourne une chaîne de caractères
constituée d’une copie de la chaîne de
caractères spécifiée sans espaces avant
le premier caractère imprimable.
55
Dim St1, St2
St1 = "Une phrase"
St2 = Left(St1, 3)
Dim nLength
nLength = Len("Une phrase")
Dim St1, St2
St1 = " Une phrase"
St2 = LTrim(St1
Dim St1, St2 As String
St1 = "Bonjour"
St2 = Mid(St1, 3, 4)
'Donne "njou"
Dim
St1, St2 As String
Retourne une chaîne de caractères
St1 = "Bonjour"
copiée d’une autre au sein de laquelle
St2 = Replace(St1, "o","?")
une expression est remplacée par une
'Donne "B?nj?ur"
expression différente.
Retourne les n derniers caractères d’une Dim St1, St2
St1 = "Une phrase"
chaîne de caractères selon le nombre
St2 = Right(St1, 3)
de caractères spécifié.
Retourne une chaîne de caractères
Dim St1, St2
constituée d’une copie de la chaîne de
St1 = "Une phrase
"
caractères spécifiée sans espaces après St2 = RTrim(St1)
le premier caractère imprimable.
Dim St As String
Retourne une chaîne de caractères
St = Space(10)
consistant au nombre d’espaces
'Donne "
"
spécifiées.
Dim St1 As String
Retourne un tableau uni-dimensionnnel
Dim St2() As String
constitué des mots d’une chaîne de
St1 = "Look at these!"
caractères spécifiée séparés par le
St2 = Split(St1)
caractère délimiteur spécifié (par défaut 'Donne ["Look", "at",
le caractère d’espacement)
"these!"]
Dim St1, St2 As String
Retourne -1, 0, ou 1 selon le résultat de Dim C As Integer
St1 = "ABCD"
la comparaison des chaînes de
caractères. Les chaînes sont comparées St2 = "abcd"
C = StrComp(S11, St2)
selon un tri alphanumérique.
'C donne 0
Dim St1, St2 As String
Retourne une chaîne de caractères
résultant de l’inversion de l’ordre de tous St1 = "Allô"
St2 = StrReverse(St1)
les caractères de la chaîne spécifiée.
Retourne une chaîne de caractères
Dim St1, St2
constituée d’une copie de la chaîne de
caractères spécifiée sans espaces avant St1 = " Une phrase "
St2 = Trim(St1)
et après le premier caractère
imprimable.
Dim St1, St2
Retourne en majuscules la chaîne de
St1 = "Une phrase"
caractères spécifiée.
St2 = UCase(St1)
Retourne la chaîne de caractères
contenue à un endroit spécifié au sein
d’une autre chaîne de caractères.
DescoDev
3. Les fonctions VBScript
56
Fonctions mathématiques
En plus des opérateurs arithmétiques de base VBScript dispose de plusieurs fonctions
permettant d’effectuer des calculs mathématiques.
Fonction
Abs
Atn
Cos
Exp
Int
Fix
Log
Randomize
Rnd
Round
Sgn
Sin
Sqr
Tan
Description
Retourne la valeur absolue de l’expression
numérique (sans le signe).
Retourne l’arc tangente en radians d’un angle
exprimé par le ratio de deux côtés d’un triangle
rectangle. Le ratio est la longueur du côté
opposé à l’angle divisé par la longueur du côté
adjacent à l’angle. Pour convertir les radians en
degrés, multipliez les radians par 180/pi.
Retourne le cosinus en radians d’un angle
exprimé par le ratio de deux côtés d’un triangle
rectangle. Le ratio est la longueur du côté
adjacent à l’angle divisé par la longueur de
l’hypoténuse. Pour convertir les radians en
degrés, multipliez les radians par 180/pi.
Retourne la valeur de ex pour un x donné.
Retourne la partie entière d’un nombre sans les
décimales après arrondissement.
Retourne la partie entière d’un nombre sans les
décimales et sans arrondissement.
Retourne le logarithme naturel d’un nombre. Le
logarithme naturel, ou népérien, est le logarithme
sur la base e valant approximativement
2.718282.
Initialise le générateur de nombres aléatoires.
Retourne un nombre aléatoire situé entre 0
inclusivement et 1 exclusivement.
Retourne un nombre arrondi à la précision
spécifiée.
Retourne une valeur indiquant le signe du
nombre spécifié. Cette valeur vaut –1 lorsque le
nombre est négatif, 1 lorsque le nombre est
positif et 0 lorsque le nombre est nul.
Retourne le sinus en radians d’un angle exprimé
par le ratio de deux côtés d’un triangle rectangle.
Le ratio est la longueur du côté opposé à l’angle
divisé par la longueur de l’hypoténuse. Pour
convertir les radians en degrés, multipliez les
radians par 180/pi.
Retourne la racine carrée d’un nombre.
Retourne la tangente en radians d’un angle
exprimé par le ratio de deux côtés d’un triangle
rectangle. Le ratio est la longueur du côté
opposé à l’angle divisé par la longueur du côté
adjacent à l’angle. Pour convertir les radians en
degrés, multipliez les radians par 180/pi.
Exemple
Abs(-2.5)
‘ Retourne 2.5
Dim PI As Double
PI = 4 * Atn(1)
Dim Sect As Double
Sect = 1 / Cos(1.3)
Exp(1)
‘ Retourne 2.718282
Int(-5.7)
‘ Retourne –6
Fix(-5.7)
‘ Retourne –5
Lg10 = Log(x)/Log(10#)
‘ Calcule le logarithme de 10
Randomize
(Max – Min + 1) * Rnd() + Min
Dim Nbr As Single
Nbr = Round(0.27182, 2)
' Retourne 0.27
Sgn(8)
Sgn(-3)
Sgn(0)
Retourne 1
Retourne –1
Retourne 0
Dim CoSec As Double
CoSec = 1 / Sin(1.3)
Sqr(25)
‘ Retourne 5
Dim CoTan As Double
CoTan = 1 / Tan(1.3)
DescoDev
3. Les fonctions VBScript
57
Fonctions mathématiques dérivées
Plusieurs fonctions mathématiques ne sont pas intrinsèques à VBScript telles le calcul de la
sécante ou le calcul d’un sinus hyperbolique. Cependant, ces fonctions mathématiques peuvent
être connues à l’aide des fonctions mathématiques intrinsèques à VBScript :
Fonction
Équivalent
Cosécante
Csc(x)
1 / Sin(x)
Cotangente
Ctan(x)
1 / Tan(x)
Sécante
Sec(x)
1 / Cos(x)
Sinus inverse
Asin(x)
Atn(x / Sqr(-x * x + 1))
Cosinus inverse
Acos(x)
Atn(-x / Sqrt(-x * x + 1)) + 2 * Atn(1)
Sécante inverse
Asec(x)
2 * Atn(1) – Atn(Sgn(x)/Sqr(x * x – 1))
Cosécante inverse
Acsc(x)
Atn(Sgn(x) / Sqr(x * x – 1))
Cotangente inverse
Acot(x)
2 * Atn(1) – Atn(x)
Sinus hyperbole
Sinh(x)
(Exp(x) – Exp(-x)) / 2
Cosinus hyperbole
Cosh(x)
(Exp(x) + Exp(-x)) / 2
Tangente hyperbole
Tanh(x)
(Exp(x) – Exp(-x)) / (Exp(x) + Exp(-x))
Sécante hyperbole
Sech(x)
2 / (Exp(x) + Exp(-x))
Cosécante hyperbole
Csch(x)
2 / (Exp(x) - Exp(-x))
Cotangente hyperbole Coth(x)
(Exp(x) + Exp(-x)) / (Exp(x) - Exp(-x))
DescoDev
3. Les fonctions VBScript
58
Fonctions de manipulation des types de données
VBScript prévoit plusieurs fonctions permettant de manipuler les variables et leur type de
données. Les fonctions dont le nom est préfixé de Is permettent retourne toujours une valeur
booléenne (true ou false) selon si l’expression spécifiée respectent les critères vérifiés par la
fonction.
Fonction
Hex
IsArray
IsDate
IsEmpty
IsNull
IsNumeric
IsObject
Oct
Description
Retourne la valeur hexadécimale de
l’expression.
Retourne True si l’expression spécifiée est
un tableau.
Retourne True si l’expression spécifiée est
une date valide.
Retourne True si l’expression spécifiée est
un type variant vide.
Retourne True si l’expression spécifiée est
une valeur Nulle.
Retourne True si l’expression spécifiée est
une valeur numérique valide.
Retourne True si l’expression spécifiée est
un objet.
Retourne la valeur octale de l’expression.
TypeName
Retourne sous forme de chaîne de
caractères le nom du type de données
contenue au sein de l’expression spécifiée.
VarType
Retourne une valeur numérique identifiant le
type de données de l’expression spécifiée.
Exemple
' Retourne 20
N = Hex(32)
If IsArray(x) Then
If IsDate(x) Then
If IsEmpty(v) Then
If IsNull(RS("x")) Then
If IsNumeric(x) Then
If IsObject(x) Then
N = Oct(32)
‘ Retourne 40
MsgBox TypeName(4)
‘ Affiche "Integer"
MsgBox TypeName("Allô")
‘ Affiche "String"
Z = "Allô"
If VarType(Z) = vbString Then
La dernière fonction de la liste - VarType - identifiera le type de données de l’expression
spécifiée en retournant l’une des constantes suivantes :
Constante
Valeur
Constante
Valeur
vbEmpty
0
vbString
8
vbNull
1
vbObject
9
vbInteger
2
vbError
10
vbLong
3
vbBoolean
11
vbSingle
4
vbVariant
12
vbDouble
5
vbDataObject
13
vbCurrency
6
vbByte
17
vbDate
7
vbArray
8192
DescoDev
3. Les fonctions VBScript
59
Fonctions de gestion des paramètres régionaux du système
VBScript sous Windows Scripting Host prévoit deux fonctions permettant de connaître et modifier
les paramètres régionaux utilisés par l’utilisateur. Les différentes configurations possibles sont
référencées par un identificateur unique (ID) dont les principaux sont listés plus bas.
Fonction
GetLocale
SetLocale
Description
Retourne l’ID des paramètres régionaux
courants.
Précise le nouvel ID des paramètres
régionaux et retourne l’ID des paramètres
régionaux courants avant le changement.
Exemple
Dim Org
Org = GetLocale()
Dim Org
Org = SetLocale("fr-ca")
Voici une liste des identificateurs de paramètres régionaux les plus importants et certains
beaucoup moins importants.
Abrv.
Valeur
Description
Abrv.
Valeur
Description
af
1078
Africain
fr-fr
1036
Français – France
ar-ae
14337
Arabe – Émirats unis
fr-be
2060
Français – Belgique
ar-sa
1025
Arabe – Arabie
fr-ca
3084
Français – Canada
eu
1069
Basque
fr-ch
4108
Français – Suisse
zh-cn
2052
Chinois – Chine
de-de
1031
Allemand – Allemagne
zh-hk
3076
Chinois – Hong Kong
de-at
3079
Allemand – Autriche
zh-sg
4100
Chinois – Singapour
de-ch
2055
Allemand – Suisse
zh-tw
1028
Chinois – Taiwan
el
1032
Grec
hr
1050
Croate
he
1037
Hébreu
cs
1029
Tchèque
hi
1081
Indou
en-au
3081
Anglais – Australie
it-it
1040
Italien – Italie
en-ca
4105
Anglais – Canada
ja
1041
Japonais
en-cb
9225
Anglais – Caraïbes
ko
1042
Coréen
en-ie
6153
Anglais – Irlande
pl
1045
Polonais
en-za
7177
Anglais – Afrique sud
pt-pt
2070
Portugais – Portugal
en-gb
2057
Anglais – Britannique
ru
1049
Russe
en-us
1033
Anglais – Etats-Unis
es-es
1034
Espagnol – Espagne
DescoDev
3. Les fonctions VBScript
60
Fonctions de contrôle du script et de son exécution
Fonction
Array
CreateObject
Eval
Description
Génère un tableau à partir
d’expressions spécifiées sous
forme de liste.
Procède à la création d’un objet
COM à l’aide du ProgID associé
et retourne un pointeur sur
l’objet ainsi créé.
Évalue une expression sous
forme de chaîne de caractères
et en retourne le résultat.
Erase
Supprime tous les index du
tableau spécifié.
GetObject
Retourne un pointeur sur un
objet existant correspondant au
ProgID ou au fichier spécifié.
LBound
Retourne l’index inférieur du
tableau spécifié.
ScriptEngine
ScriptEngineBuild
Version
ScriptEngineMajor
Version
ScriptEngineMinor
Version
UBound
Exemple
Dim A, B
A = Array(10, 15, 20)
B = A(2)
' B vaut 20
Set Pres = CreateObject d
("Powerpoint.Application")
Pres.Visible = True
If Eval("x = y") Then
Dim A
A = Array(10, 15, 20)
Erase A
Set Obj = d
GetObject("C:\feuil.xls")
Obj.Visible = True
A = Array(10, 15, 20)
For X =LBound(A) To UBound(A)
MsgBox A(X)
Next
MsgBox ScriptEngine()
' Retourne VBScript
Retourne le nom du moteur de
script utilisé au sein du script.
Retourne le numéro
MsgBox d
d’assemblage du moteur de
ScriptEngineBuildVersion()
script utilisé.
Retourne le numéro principal de
MsgBox d
la version du moteur de script
ScriptEngineMajorVersion()
utilisé.
Retourne le numéro secondaire
MsgBox d
de la version du moteur de script
ScriptEngineMinorVersion()
utilisé.
Dim A
A = Array(10, 15, 20)
Retourne l’index supérieur du
For X =LBound(A) To UBound(A)
tableau spécifié.
MsgBox A(X)
Next
L’exemple suivant récupère et affiche différentes informations concernant le moteur de script
actuel (nom du moteur et numéro de version principalement).
MsgBox "Moteur " & ScriptEngine() & vbCrLf & "Build: " & ScriptEngineBuildVersion() & vbCrLf & "v." & ScriptEngineMajorVersion() & "." & ScriptEngineMinorVersion(), vbInformation, "Version"
CH03\Versions.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
61
4
Modèles d’objets de
Windows Script Host
DescoDev
4. Modèles d’objets de Windows Script Host
62
4- Modèles d’objets de Windows Script Host
Comme mentionné au premier chapitre, les scripts que vous écrivez utilisent un hôte afin de
pouvoir s’exécuter. Cet hôte peut être CScript.exe ou WScript.exe afin d’exécuter des
scripts Windows mais pourrait également être IIS afin d’exécuter des scripts serveur (ASP) ou
Internet Explorer afin d’exécuter des scripts clients.
Ces différents hôtes permettent aux moteurs de script VBScript et JScript de lire, d’interpréter et
d’exécuter les instructions spécifiés à l’aide du langage adéquat.
Cependant, rien dans ces outils ne permettra de manipuler la base de registre, de connecter des
lecteurs réseau, d’effectuer des backup, etc. Cependant, les scripts peuvent demander
l’activation de composants exécutables compilés et résidents sur le système. Ces composants
sont des fichiers possédant généralement l’extension *.dll ou *.ocx et ont été écrits et compilés à
l’aide de langages de programmation tels le C++, Delphi ou Visual Basic.
Quoique les scripts ne puissent créer eux-mêmes leurs propres composants, ils peuvent exploiter
les fonctionnalités de ceux qui existent déjà. Parmi ceux-ci, nommons les plus courants :
•
WSH est le modèle de base mis à la disposition de Windows Script Host et permet la
création de raccourcis, la connexion de lecteurs réseau, l’exécution de commandes, ect.
•
Script Runtime permet la manipulation des lecteurs, des répertoires et des fichiers.
•
ADSI permet la manipulation des annuaires Active Directory de Windows 2000 et de
Windows.NET Server.
DescoDev
4. Modèles d’objets de Windows Script Host
63
Les objets WScript
L’illustration ci-contre représente le modèle d’objets de
Windows Script Host permettant d’exécuter un grand
nombre de tâches administratives.
Le modèle d’objet de Windows Script Host est constitué
de 14 objets dont l’objet racine est l’objet WScript à la
base de tous. Chacun de ces objets possèdent des
propriétés et des méthodes.
Objet
WScript
WshArguments
WshNamed
WshUnnamed
WshNetwork
WshController
WshRemote
WshRemoteError
Ce que permet cet objet
Retourner et déterminer les différents arguments de la ligne de
commande.
Déterminer le nom du fichier de script.
Déterminer l’hôte de script et la version de l’hôte en exécution.
Créer, connecter et déconnecter des objets COM.
Stopper l’exécution d’un script.
Interagir avec l’utilisateur à l’aide de boîtes de message.
Collection permettant d’accéder à l’ensemble des arguments de la
ligne de commande.
Accéder à l’ensemble des arguments nommés de la ligne de
commande.
Accéder à l’ensemble des arguments non-nommés de la ligne de
commande.
Connecter et déconnecter des partages réseau, des imprimantes
partagées.
Accéder aux informations au sujet de l’utilisateur en cours.
Créer un processus afin d’exécuter un script sur un autre ordinateur
du réseau.
Administrer un autre ordinateur du réseau et manipuler ses scripts.
WshShortcut
Accéder au code d’erreur produit par l’exécution d’un script distant.
Démarrer un programme.
Manipuler la base de registre et les variables d’environnement.
Créer des raccourcis.
Accéder à un répertoire système.
Créer un raccourci.
WshUrlShortcut
Créer un raccourci internet.
WshEnvironment
Accéder aux variables d’environnement.
WshSpecialFolders
Accéder aux répertoires spéciaux de Windows.
Déterminer l’état ou le code d’erreur à propos d’un script.
Accéder aux canaux StdIn, StdOut et StdErr.
WshShell
WshScriptExec
DescoDev
4. Modèles d’objets de Windows Script Host
64
L’objet WScript
L’objet WScript est l’objet racine du modèle d’objets de Windows Script Host et expose les
fonctionnalités de base de celui-ci. L’objet WScript est un objet intrinsèque au modèle d’objets
de Windows Script Host et n’a pas besoin d’être instancié avant d’être utilisé. Une instance de cet
objet est omniprésente dans tout les scripts que vous créerez.
Propriété
Arguments
FullName
Interactive
Name
Path
Description
Retourne la collection d’objets
WshArguments correspondants à
l’ensemble des paramètres passés à
la ligne de commande le cas
échéant.
Retourne le chemin complet de l’hôte
exécutant le présent fichier de script.
Permet de connaître l’emplacement
de l’hôte à partir de lequel le script
est exécuté.
Détermine ou retourne le mode de
script. Le script affiche les boîtes de
message et d’erreur lorsque cette
propriété prend la valeur True et
n’affiche aucune information
lorsqu’elle prend la valeur False.
Retourne le nom de l’objet WScript
Retourne le chemin du répertoire
contenant l’hôte exécutant le présent
fichier de script.
Retourne le chemin complet du
présent fichier de script. Permet de
ScriptFullName connaître l’emplacement à partir de
lequel le script est exécuté peu
importe l’hôte utilisé.
Retourne le nom du fichier du
présent fichier de script. Permet de
ScriptName
connaître le nom du fichier à partir de
lequel le script est exécuté peu
importe l’hôte utilisé.
Permet l’accès en écriture seulement
à la sortie standard pour les
StdErr
messages d’erreur. Utilisable sous
l’hôte CScript.exe seulement.
Permet la lecture de l’entrée
StdIn
standard. Utilisable sous l’hôte
CScript.exe seulement.
Permet l’accès en écriture seulement
StdOut
à la sortie standard. Utilisable sous
l’hôte CScript.exe seulement.
Permet de connaître la version de
Version
Window Script Host utilisée pour
l’exécution du script.
Exemple
Set Args = WScript.Arguments
For I = 0 to Args.Count - 1
WScript.Echo Args(I)
Next
WScript.Echo WScript.FullName
‘ Produit le résultat suivant:
C:\winnt\system32\cscript.exe
WScript.Interactive = False
WScript.Echo WScript.Name
WScript.Echo WScript.Path
‘ Produit le résultat suivant:
C:\winnt\system32
N = WScript.ScripFullNamePath
WScript.Echo N
‘ Produit le résultat suivant:
C:\scripts\test.vbs
N = WScript.ScripFullNamePath
WScript.Echo N
‘ Affiche
test.vbs
Z = "Allô la planète"
WSript.StdOut.Write Z
N = WScript.Version
WScript.Echo "WSH " & N
' Produirait WSH 5.6
DescoDev
4. Modèles d’objets de Windows Script Host
Méthode
ConnectObject
CreateObject
DisconnectObject
Echo
GetObject
Quit
Sleep
Description
Établi un lien avec l’objet
spécifié afin d’en gérer les
événements.
Procède à la création d’un objet
COM à l’aide du ProgID associé
et retourne un pointeur sur
l’objet ainsi créé.
Supprime le lien établi avec
l’objet spécifié afin de ne plus en
gérer les événements.
Affiche un message à
l’utilisateur au sein d’une boîte
de message ou de l’invite de
commande.
Retourne un pointeur sur un
objet existant correspondant au
ProgID ou au fichier spécifié.
Force la terminaison de
l’exécution du script courant.
Suspend l’exécution du script
pour un lapse de temps spécifié
en millisecondes.
65
Exemple
Set oIE = CreateObject d
("InternetExplorer.Application")
WScript.ConnectObject(oIE, "IE_")
Set Pres = CreateObject d
("Powerpoint.Application")
Pres.Visible = True
DisconnectObject oIE
WScript.Echo "Allô la planète"
Set Obj = d
GetObject("C:\CAD\SCHEMA.CAD")
MyApp = Obj.Application
Wscript.Quit
WScript.Sleep 500
Voici l’exemple d’un script simple utilisant certaines des méthodes et propriétés de l’objet
WScript et permettant de connaître l’hôte utilisé pour exécuter un script ainsi que sa version :
HName = WScript.FullName
HVersion = WScript.Version
SName = WScript.ScriptFullName
WScript.Echo "Vous utilisez l’hôte " & HName & " v." & HVersion
WScript.Echo "Vous exécutez le script " & Sname
CH04\WScript.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
66
La méthode WScript.CreateObject
La méthode CreateObject de l’objet WScript permet la création de différents autres objets
disponibles sur le système sur lequel le script s’exécute. Cette méthode est très utile dans
l’exécution de scripts Windows Script Host puisqu’elle permettra la création des autres objets du
modèle WScript ainsi que des autres modèles abordés, l’activation d’Internet Explorer,
l’établissement d’une connexion sur un système de base de données, la gestion d’IIS, etc.
Notez que cette méthode a été empruntée directement au langage VBScript lui-même. Ainsi,
puisque le langage possède intrinsèquement cette fonctionnalité, vous pouvez utiliser
CreateObject sans le précéder du nom d’objet WScript. Ainsi, vous utiliserez la méthode
native au langage VBScript et le résultat sera le même. La seule différence se situera dans le
nombre de touches que vos doigts auront dû activer sur le clavier pour rédiger le code.
Les objets disponibles sur le poste sont listés
dans la base de registres de celui-ci sous la clé
HKEY_CLASSES_ROOT. Cette clé liste d’abord
les différentes extensions de fichiers reconnus
à l’aide d’inscriptions du type *.doc, *.txt,
etc. Ensuite, une série d’inscriptions sont listées
et possèdent généralement le format
"Librairie.Objet" et peuvent ressembler à
IISWAM.Application, Imaging.Document
ou Excel.Worksheet. Ces inscriptions sont
appelées ProgID est constituent chacune un
objet que votre script peut créer.
La première section d’un ProgID identifie le
modèle d’objets, c’est à dire la librairie
exécutable à laquelle appartient l’objet. La
seconde section du ProgID identifie l’objet luimême.
Ainsi, si notre script doit provoquer l’affichage de Microsoft Word, notre script pourrait s’exécuter
comme suit :
Dim Wrd
Set Wrd = WScript.CreateObject("Word.Application")
Wrd.Visible = True
CH04\Afficher Word.vbs
Notez cependant que chaque modèle d’objet possède ses fonctionnalités propres et son
architecture propre. Nous étudierons plusieurs d’entre eux mais il est hors des prétentions de cet
ouvrage de tout les couvrir. Il vous faudra donc recourir à l’aide en ligne de ces objets, au
navigateur d’objets de Microsoft Visual Basic ou Microsoft Access plus accessible ou à diverses
sources disponibles sur l’Internet.
DescoDev
4. Modèles d’objets de Windows Script Host
67
Cet exemple affiche un document Html en créant un objet Internet Explorer à l’aide de la
méthode CreateObject et lui demande d’afficher un document Html spécifique. Ensuite, le
script attend cinq (5) secondes puis décharge le document Html après avoir affiché une boîte de
message. Fort sympatique…
Dim oIE, Chemin
'***** Procède à la création de l’objet Internet Explorer *******'
Set oIE = WScript.CreateObject("InternetExplorer.Application")
'******* Détermine l’emplacement du fichier *.htm à afficher ****'
Chemin = WScript.ScriptFullName
Chemin = Left(Chemin, InStrRev(Chemin, "\"))
'************* Attend que Internet Explorer s’affiche
Do While oIE.Busy
WScript.Sleep 200
Loop
*********'
'********************* Charge le document *.htm
oIE.Navigate Chemin & "repos.htm"
oIE.Visible = True
***************'
'**********************
WScript.Sleep 5000
***************'
Patiente cinq secondes
'***********************
Ferme Internet Explorer
************'
MsgBox "Bon, c'est assez, retournez au travail maintenant!", d
vbExclamation, "C'est assez"
oIE.Quit
Set oIE = Nothing
CH04\Repos.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
68
L’objet WshArguments
L’objet WshArguments procure une collection de l’ensemble des paramètres passés en ligne de
commande au présent script. Les paramètres se présentent au sein de la collection dans l’ordre
dans lequel ils ont été passés au script. L’objet WshArguments est utilisé en référençant la
propriété Arguments de l’objet WScript.
Voici la liste complète des méthodes et des propriétés prévues par cet objet.
Propriété
Count
Named
Unamed
Méthode
ShowUsage
Description
Exemple
Set Ag = WScript.Arguments
Retourne le nombre total de paramètres For I = 0 to Ag.Count - 1
WScript.Echo Ag(I)
passés dans la ligne de commande.
Next
Retourne une collection de l’ensemble
Set NamedAg = d
WScript.Arguments.Named
des paramètres nommés passés en
ligne de commande.
Retourne une collection de l’ensemble
Set UnamedAg = d
WScript.Arguments.Unamed
des paramètres non-nommés passés
en ligne de commande.
Description
Affiche la documentation
personnalisée concernant l’utilisation
du présent script. La documentation
ne peut être insérée qu’au sein des
fichiers de script *.wsf.
Exemple
Voir l’exemple complet ci-bas. Notez
que cette méthode ne peut être utilisée
qu’au sein des fichiers *.wsf qui seront
présentés au chapitre 5.
Note : Les éléments de la collection WshArguments sont indexés à partir de 0. Ainsi, si vous
désirez parcourir l’ensemble des paramètres, vous devrez utiliser une boucle débutant à 0 et se
terminant à WshArguments.Count –1.
<job>
<runtime>
<description>Ce script réamorce un serveur</description>
<named
name = "Server"
helpstring = "Serveur à réamorcer."
type = "string"
required = "true"
/>
<example>Exemple: usage.wsf /server:scripting</example>
</runtime>
<script language="VBScript">
If WScript.Arguments.Count <> 1 Then
WScript.Arguments.ShowUsage
WScript.Quit
End If
</script>
</job>
CH04\usage.wsf
DescoDev
4. Modèles d’objets de Windows Script Host
69
Les objets WshNamed et WshUnamed
Imaginons temporairement un script permettant de connecter un lecteur réseau. Ce script pas
trop hypothétique attendrait deux arguments :
•
•
La lettre du lecteur à connecter
Le chemin réseau à connecter sous ce lecteur
Lorsqu’un utilisateur lancera ce script, il pourra spécifier la valeur des arguments à l’aide d’une
syntaxe comme la suivante :
MonScript.vbs z \\monServeur\chemin
À l’aide de cette syntaxe, les arguments sont spécifiés dans l’ordre sans aucune autre directive à
l’intention du script afin que ce dernier distingue les différents arguments. Ainsi, le script devra
supposer que le premier argument spécifié est bien la lettre à connecter tandis que le second
argument est le chemin réseau à connecter. Dans cette situation, l’utilisateur ne peut mélanger
l’ordre des arguments sous peine que le script ne génère une erreur.
Par contre, l’utilisateur peut exécuter le script en nommant les différents arguments :
MonScript.vbs
/lecteur:z
/chemin:\\monServeur\chemin
Ce qui lui procure l’avantage de ne pas à devoir tenir compte de l’ordre des paramètres tout en
possédant l’assurance que le script s’exécutera correctement. Il ne s’agit pas là d’une prouesse
fort complexe puisque le script récupère la valeur des différents arguments à l’aide de leur nom
au lieu de les récupérer à l’aide de leur position ordinale.
Ainsi, les objets WshNamed et WshUnamed sont des éléments plus spécifiques de la collection
WshArguments. Ce dernier fournissant la liste complète des arguments spécifiés par l’utilisateur,
l’objet WshNamed représente un argument récupéré à l’aide de son nom et est récupéré à l’aide
de la propriété Named de l’objet WshArguments. Quant à lui, l’objet WshUnamed représente un
argument récupéré par le script à l’aide de sa position ordinale et est récupéré à l’aide de la
propriété Unamed.
Voici la méthode et la propriété prévues par ces objets.
Propriété
Count
Méthode
Exists
Description
Exemple
Set Ag = WScript.Arguments.Named
Retourne le nombre de paramètres For N = 0 to Ag.Count - 1
WScript.Echo Ag(N)
passés dans la ligne de commande.
Next
Description
Retourne si l’argument nommé
a été spécifié par l’utilisateur ou
non. Utilisé seulement avec
WshNamed.
Exemple
If Exists("lecteur") = False Then
MsgBox "Paramètre Lecteur
manquant"
End If
DescoDev
4. Modèles d’objets de Windows Script Host
70
L’exemple complet suivant permet de connecter un lecteur réseau. Ce script pas trop attend deux
arguments :
•
•
/Lecteur La lettre du lecteur à connecter
/Chemin Le chemin réseau à connecter sous ce lecteur
L’utilisateur peut utiliser cette commande avec une syntaxe similaire à la suivante :
Lecteur.vbs
/lecteur:z
/chemin:\\monServeur\chemin
Option Explicit
Dim objNet, Lct, Chm
'********* Vérifie l'existence des paramètres nommés *****************'
If WScript.Arguments.Named.Exists("lecteur") = False OR _
WScript.Arguments.Named.Exists("chemin") = False Then
MsgBox "Utilisez la commande comme suit :" & vbCrLf & vbCrLf _
& "Lecteur.vbs /Lecteur:lecteur /Chemin:chemin", vbInformation
Else
'***** Stocke la valeur des paramètres dans deux variables
Lct = WScript.Arguments.Named("lecteur")
Chemin = WScript.Arguments.Named("chemin")
******'
'************ Procède à la connexion du lecteur réseau ************'
Set objNet = CreateObject("WScript.Network")
On Error Resume Next
Lct = Left(Lct, 1) & ":"
objNet.MapNetworkDrive Lct, Chemin
'****************** Détecte toute forme d’erreur ****************'
If Err.Number Then
MsgBox "Le lecteur " & Lct & " était déjà connecté"
Else
MsgBox "Le lecteur " & Lct & " est connecté."
End If
On Error Goto 0
Set objNet = Nothing
End If
CH04\Lecteur.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
71
L’objet WshNetwork
L’objet WshNetwork procure une pluralité de fonctionnalités concernant le réseau à lequel le
poste est connecté ainsi que les chemins et imprimantes qui y sont accessibles. Vous créez donc
un objet WshNetwork lorsque vous désirez connecter ou déconnecter un lecteur ou une
imprimante réseau, obtenir des informations sur le réseau et sur l’utilisateur en cours.
Voici la liste complète des méthodes et des propriétés prévues par cet objet.
Propriété
Description
ComputerName
Retourne le nom NetBIOS du poste
sur lequel s’exécute le script.
UserDomain
Retourne le nom du domaine à
lequel appartient le poste sur lequel
s’exécute le script.
UserName
Retourne le nom de l’utilisateur
exécutant le script.
Méthode
AddWindowsPrinter
Connection
AddPrinterConnection
EnumNetworkDrives
Description
Connecte en Windows
l’imprimante spécifiée sur
l’imprimante réseau
spécifiée.
Connecte en MS DOS
l’imprimante spécifiée sur
l’imprimante réseau
spécifiée.
Retourne une collection
contentant le nom des
lecteurs réseau
actuellement connectés.
Retourne une collection
contentant le nom des
EnumPrinterConnections imprimantes réseau (MS
DOS et Windows)
actuellement connectés.
MapNetworkDrive
RemoveNetworkDrive
RemovePrinter
Connection
SetDefaultPrinter
Connecte le lecteur spécifié
sur le chemin réseau
spécifié.
Déconnecte le lecteur
spécifié.
Déconnecte l’imprimante
spécifiée.
Spécifie l’imprimante par
défaut.
Exemple
Set Nt = d
CreateObject("WScript.Network")
MsgBox Nt.ComputerName
Set Nt = d
CreateObject("WScript.Network")
MsgBox Nt.UserDomain
Set Nt = d
CreateObject("WScript.Network")
MsgBox Nt.UserName
Exemple
Nt.AddWindowsPrinterConnection
"\\Serveur\Printer"
Nt.AddPrinterConnection d
"LPT1", "\\Serveur\Printer"
Set oDrv = Nt.EnumNetworkDrives
For i=0 to oDrv.Count -1 Step 2
WScript.Echo oDrv(i) d
& " = " & oDrv(i+1)
Next
Set oPrn = d
Nt.EnumPrinterConnections
For i=0 to oPrn.Count -1 Step 2
WScript.Echo oPrn(i) d
& " = " & oPrn(i+1)
Next
Nt.MapNetworkDrive "z:", d
"\\Serveur\chemin"
Nt.RemoveNetworkDrive "z:"
Prn = "\\prnSvr\DefaultPrinter"
Nt.RemovePrinterConnection Prn
Prn = "\\prnSvr\DefaultPrinter"
Nt.AddPrinterConnection d
"LPT1", "\\Serveur\Printer"
Nt.SetDefautlPrinter Prn
DescoDev
4. Modèles d’objets de Windows Script Host
72
L’exemple suivant récupère plusieurs informations au sujet de l’utilisateur ainsi que du poste sur
lequel ce dernier est actuellement connecté (liste des lecteurs réseau et des imprimantes). Les
informations sont concaténés au sein d’une phrase avant d’être affichées en totalité à l’aide d’une
boîte de message.
Option Explicit
Dim Texte, NT
Dim Drv, Prn, K
Set NT = WScript.CreateObject("WScript.Network")
Set Drv = NT.EnumNetworkDrives()
Set Prn = NT.EnumPrinterConnections()
'****************** Informations générales ************************'
Texte = "Bonjour " & NT.UserName & ", " & vbCrLf & vbCrLf
Texte = Texte & "vous êtes connecté sur l'ordinateur " d
& NT.ComputerName
Texte = Texte & " appartenant au domaine " & NT.UserDomain & "." d
& vbCrLf & vbCrLf
'*************** Liste des lecteurs réseau ************************'
Texte = Texte & "Ce poste possède les lecteurs réseaux suivants:" d
& vbCrLf
If Drv.Count = 0 Then
Texte = Texte & "
* Aucun lecteur réseau détecté." & vbCrLf
Else
For K = 0 to Drv.Count - 1 Step 2
Texte = Texte & "
* " & Drv(K) & " = " & Drv(K+1) & vbCrLf
Next
End If
'**************** Liste des imprimantes **************************'
Texte = Texte & vbCrLf & "Ce poste possède les imprimantes " d
& "suivantes:" & vbCrLf
If Prn.Count = 0 Then
Texte = Texte & "
* Aucune imprimante détectée." & vbCrLf
Else
For K = 0 to Prn.Count - 1 Step 2
Texte = Texte & "
* " & Prn(K) & " = " & Prn(K+1) & vbCrLf
Next
End If
'****************** Affiche le message ***************************'
MsgBox Texte, vbInformation, "Bonjour"
CH04\Network.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
73
L’objet WshShell
L’objet WshShell procure une série de fonctionnalités permettant de piloter le système
d’exploitation et d’en extirper différentes informations utiles comme les valeurs des variables
d’environnement, le chemin des répertoires spéciaux, etc.
Voici la liste complète des méthodes et des propriétés prévues par cet objet.
Propriété
Description
Exemple
CurrentDirectory
Retourne ou spécifie le répertoire actif.
Rep = Sh.CurrentDirectory
Environment
SpecialFolders
Retourne l’objet WshEnvironment
contenant la liste des variables
d’environnement et leurs valeurs.
Tapez Set à l’invite de commande pour
connaître la liste des variables
d’environnement de votre système.
Retourne le chemin complet d’un
répertoire spécial. On entend par
répertoire spéciaux les répertoires
system32, program files, desktop, etc.
Voyez ci-dessous la liste des
constantes existants à ce sujet.
Set Env = d
Sh.Environment("systemroot")
Rep = d
Sh.SpecialFolders("Desktop")
MsgBox Rep
Voici la liste des chaînes de caractères constantes que vous pouvez utiliser avec la méthode
SpecialFolders. Notez que la casse n’importe pas lorsque vous précisez la valeur.
SpecialFolders
Description
AllUsersDesktop
Éléments du bureau partagé par tous les profils utilisateurs.
AllUsersStartMenu
Éléments du menu Démarrer partagé par tous les profils utilisateurs.
Desktop
Éléments du menu Démarrer/Programmes partagé par tous les profils
utilisateurs.
Éléments du menu Démarrer/Programmes/Démarrage partagé par tous
les profils utilisateurs.
Éléments du menu Démarrer de l’utilisateur en cours.
Favorites
Éléments du menu Démarrer/Favoris de l’utilisateur en cours.
Fonts
Éléments du répertoire Fonts contenant les polices de caractères installées.
MyDocuments
Éléments du répertoire MesDocuments de l’utilisateur en cours.
NetHood
Éléments de voisinage réseau de l’utilisateur en cours.
PrintHood
Éléments des imprimantes réseau de l’utilisateur en cours.
Programs
Éléments du menu Démarrer/Programmes de l’utilisateur en cours.
Recent
Éléments du menu Démarrer/Documents de l’utilisateur en cours.
SendTo
Éléments du répertoire SendTo de l’utilisateur en cours.
StartMenu
Éléments du menu Démarrer de l’utilisateur en cours.
AllUsersPrograms
AllUsersStartup
StartUp
Templates
Éléments du menu Démarrer/Programmes/Démarrage de l’utilisateur en
cours.
Éléments du répertoire Modèles contenant les modèles de documents vides.
DescoDev
4. Modèles d’objets de Windows Script Host
Méthode
Description
AppActivate
Active une fenêtre existante par
son titre et lui donne le focus.
CreateShortcut
Procède à la création d’un objet
WshShortcut permettant de
créer un raccourci. Voyez la
description plus bas pour plus
de détails.
ExpandEnvironment Retourne la valeur étendue
Strings
d’une variable d’environnement.
LogEvent
Popup
RegDelete
RegRead
RegWrite
Run
SendKeys
Ajoute une entrée dans le
journal d’événements
Application. Voyez le tableau
plus bas pour connaître les
types de messages disponibles.
Boîte de dialogue partagée par
tous les langages de script.
Préférez l’instruction MsgBox
intrinsèque à Visual Basic.
Supprime une clé de la base de
registres.
Lit la valeur d’une clé de la base
de registres.
Spécifie la valeur d’une clé de la
base de registres.
Démarre une application par son
chemin complet. Voyez les
Technique avancées de Script
au chapitre 5 pour des exemples
approfondies.
Envoie le signal de touches
enfoncées comme si l’utilisateur
tapait sur le clavier.
74
Exemple
Sh.Run "notepad"
WScript.Sleep 200
Sh.Activate "notepad"
Sh.SendKeys "Allô"
chemin = "c:\raccourci.lnk"
Set Lnk = d
Sh.CreateShortcut(chemin)
Lnk.TargetPath = "notepad.exe"
Lnk.Save
WinDir = d
Sh.ExpandEnvironmentStrings(d
"%windir%")
MsgBox "WinDir = " & WinDir
Msg = "Le script a terminé."
Sh.LogEvent 0, Msg
Sh.Popup "Allô la planète!",,d
"Titre", 64
Sh.RegDelete "HKCU\Soft\ACME\"
Valeur = d
Sh.RegRead("HKCU\Soft\ACME\")
Sh.RegWrite "HKCU\Soft\ACME\",d
42, "REG_BINARY"
Sh.Run "c:\winnt\notepad.exe"
Sh.Activate "notepad"
Sh.SendKeys "Allô"
Voici la liste des valeurs que vous pouvez utiliser avec la méthode LogEvent. Notez que
Windows 9x et ME consigneront le journal au sein d’un fichier WSH.log situé dans le répertoire
Windows.
Type de message
Description
0
SUCCESS – L’application s’est exécuté avec succès.
1
ERROR – Enregistrement d’une erreur ayant causée des problèmes graves.
WARNING – Enregistrement d’un avertissement pouvant éventuellement
causer des problèmes.
INFORMATION – Enregistrement d’une information particulière.
AUDIT_SUCCESS – Enregistrement d’une tentative d’accès sécurisé qui a
réussie.
AUDIT_FAILURE – Enregistrement d’une tentative d’accès sécurisé qui a
échouée.
2
4
8
16
DescoDev
4. Modèles d’objets de Windows Script Host
75
Création de raccourcis
Les objets WshShortcut et WshURLShortcut permettent des créer des raccourcis sur le
disque de l’utilisateur. Pour ce faire, il suffit d’obtenir une référence sur un nouvel objet de type
WshShortcut ou WshURLShortcut, d’en configurer ensuite la destination, l’icône, etc. avant de
le sauvegarder à l’aide de la méthode Save. Aucun raccourci ne sera créé si vous omettez
d’invoquer la méthode Save.
La première étape consiste donc à créer un nouvel objet de type WshShortcut. L’extrait suivant
procède à la création d’un raccourci nommé monRaccourci à la racine du disque c :
Dim MonRaccourci, Sh
Set Sh = WScript.CreateObject("WScript.Shell")
Set MonRaccourci = Sh.CreateShortcut("c:\monRaccourci.lnk")
Ensuite, il faut piloter le nouveau raccourci en attribuant les valeurs désirées à ses propriétés
avant de le sauvegarder à l’aide de la méthode Save :
MonRaccourci.TargetPath = "c:\program files\microsoft " _
& office\office\winword.exe"
MonRaccourci.WindowStyle = 1
MonRaccourci.IconLocation = "c:\program files\microsoft " _
& office\office\winword.exe, 0"
MonRaccourci.Description = "Démarrez Microsoft Word"
MonRaccourci.Save
Notez que la propriété IconLocation peut pointer sur un fichier exécutable *.exe ou *.dll
possédant des icônes ou sur un icône *.ico standard. Dans le premier cas, vous devez
spécifiez l’identificatif numérique de l’icône au sein du fichier binaire. Dans le second cas, seul le
nom du fichier icône suffit.
La propriété WindowStyle permet de spécifier l’état de la fenêtre dans laquelle le logiciel pointé
s’affichera. La propriété peut prendre les valeurs suivantes :
Valeur WindowStyle
0
1
2
3
4
6
Description
Aucune fenêtre ne sera créée pour le logiciel qui s’exécutera de façon
invisible.
Le logiciel s’affichera dans une fenêtre normale et obtiendra le focus au
démarrage.
Le logiciel s’affichera dans une fenêtre réduite en icône et obtiendra le
focus au démarrage.
Le logiciel s’affichera dans une fenêtre pleines dimensions et obtiendra le
focus au démarrage.
Le logiciel s’affichera dans une fenêtre normale et n’obtiendra pas le
focus au démarrage.
Le logiciel s’affichera dans une fenêtre réduite en icône et n’obtiendra
pas le focus au démarrage.
DescoDev
4. Modèles d’objets de Windows Script Host
76
L’exemple suivant crée sur le bureau de tous les utilisateurs du système un raccourci vers
Internet Explorer. Le script se sert de la propriété SpecialFolders afin d’obtenir le
chemin du répertoire représentant le bureau partagé par tous les profils utilisateurs.
Dim MonRaccourci, Sh
Dim Bureau
Set Sh = WScript.CreateObject("WScript.Shell")
'********* Récupère le répertoire représentant le Bureau ***********'
Bureau = Sh.SpecialFolders("AllUsersDesktop")
'**************** Crée le raccourci sur le Bureau ******************'
Set MonRaccourci = Sh.CreateShortcut(Bureau & "\internet.lnk")
'***************** Configure le nouveau raccourci ******************'
MonRaccourci.TargetPath = "c:\program files\internet " _
& "explorer\iexplore.exe"
MonRaccourci.WindowStyle = 3
MonRaccourci.IconLocation = "c:\program files\internet " _
& "explorer\iexplore.exe, 0"
MonRaccourci.Description = "Se connecter à l'internet"
'********************* Sauvegarde le raccourci *********************'
MonRaccourci.Save
CH04\Raccourci.vbs
Notez que certains logiciels antivirus n’apprécieront peut-être pas ce type de manipulations des
éléments du bureau des utilisateurs. Ainsi, il vous faudra vous assurer de la bonne configuration
de votre antivirus si vous escomptez utiliser ces fonctions en environnement de production.
DescoDev
4. Modèles d’objets de Windows Script Host
77
Manipulation de la base de registres
La base de registres est une base de données utilisée par Microsoft depuis Windows 95 où sont
centralisées les configurations matérielle et logicielle, les préférences des utilisateurs, etc. Il est
possible d’ajouter, modifier, lire et supprimer des clés de la base de registres à l’aide de Windows
Script Host. Notez d’abord que Microsoft conseille que l’utilisateur utilise le panneau de
configuration de son poste afin de modifier les configurations consignées au sein de la base de
registres et prévient que toute modification manuelle des valeurs qui y sont contenues pourrait
mettre en péril le bon fonctionnement du système d’exploitation. Et Microsoft n’a pas tort à ce
sujet. Prenez garde de bien connaître les valeurs que vous désirez modifier ainsi que leur utilité
avant d’en altérer le contenu. Vous êtes averti.
La base de registres présente les informations de manière hiérarchique où chacune des données
est associée à une valeur et où chacune des valeurs appartient à appartient à une sous-clé ou
une clé.
Clés et sous-clés
Valeurs
Données
Les informations sont réparties thématiquement au sein de clés de base qui ne peuvent être
altérées et qui regroupent les sous-clés selon leur utilité :
Clé de base
Abrév.
HKEY_CLASSES_ROOT
HKCR
HKEY_CURRENT_USER
HKCU
HKEY_LOCAL_MACHINE
HKLM
HKEY_USERS
N/a
HKEY_CURRENT_CONFIG N/a
Description
Contient les extensions des fichiers et les programmes
et actions associées à ces fichiers ainsi que la liste
d’objets COM pouvant être créés sur le poste à l’aide
de l’instruction CreateObject.
Contient les préférences logicielles et le profil matériel
de l’utilisateur en cours.
Contient les configurations logicielles et matérielles
applicables à l’ensemble de l’ordinateur.
Contient les préférences partagées par l’ensemble des
utilisateurs. Contient également le profil appliqué à tout
nouvel utilisateur authentifié pour la première fois.
Contient les différences entre la configuration
matérielle actuelle et celle utilisée lors du démarrage
du système. Cette clé permet le redémarrage en
utilisant la dernière bonne configuration connue.
DescoDev
4. Modèles d’objets de Windows Script Host
78
La méthode RegRead permet de lire la valeur d’une clé de la base de registres. La fonction
attend en paramètre la clé à ouvrir et, en échange, retourne la valeur qui y est contenue. Notez
que si le nom de la clé à ouvrir se termine par une barre oblique ( \ ), la valeur par défaut sera
récupérée, celle qui est indiquée sous le nom "(par défaut)" au sein de l’éditeur de registre.
Il est donc possible de récupérer le navigateur web par défaut sur le poste en cours en examinant
quel logiciel est associé aux fichiers possédant l’extension *.htm.
Au sein de la clé de base HKEY_CLASSES_ROOT, l’ensemble des extensions connues des
fichiers sont stockées et contiennent, en valeur par défaut, une description du fichier appelée
FriendlyName. Une autre clé ayant pour nom la même valeur que ce FriendlyName possède
le chemin du logiciel à exécuter lorsque ce type de fichier est exécuté :
•
Lorsque l’utilisateur active un fichier *.htm, Windows recherche la clé .htm au sein de la
clé de base HKEY_CLASSES_ROOT;
•
Si la clé est trouvée, la valeur par défaut est prise en note. Ensuite, Windows recherche
une clé de ce nom située à la racine de la clé de base HKEY_CLASSES_ROOT;
•
Si la clé est trouvée, Windows recherche la sous-clé "\shell\open\command" et
récupère la valeur par défaut qui y est stockée;
•
Si la clé et la valeur sont trouvée, Windows exécute le logiciel spécifié.
Suivons le même cheminement que Windows et trouvons le chemin du fichier exécutable servant
de navigateur web par défaut :
Dim IE, Sh
Set Sh = WScript.CreateObject("WScript.Shell")
IE = Sh.RegRead("HKEY_CLASSES_ROOT\.htm\")
IE = Sh.RegRead("HKEY_CLASSES_ROOT\" & IE & "\shell\open\command\")
MsgBox IE, vbInformation, "Navigateur web par défaut"
CH04\NavigateurWeb.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
79
La méthode RegWrite permet d’écrire la valeur d’une clé de la base de registres et d’en créer
une nouvelle si celle spécifiée n’existe pas. La fonction attend en paramètres la clé à ouvrir, la
valeur à y inscrire et, optionnellement, le type de données à y inscrire.
En Windows Script Host , les données stockées au sein de la base de registres peuvent être des
valeurs d’un des types suivants. Par défaut, le type REG_SZ sera utilisé.
Type de données
Description
REG_BINARY
Valeur numérique stockée en format binaire.
REG_DWORD
Valeur numérique sur 16-bits.
REG_SZ
Chaîne de caractère.
REG_EXPAND_SZ
Chaîne de caractère extensible (Ex : "%windir%\\notepad.exe" ).
Notez que si le nom de la clé à ouvrir se termine par une barre oblique ( \ ), la valeur par défaut
sera écrite ou créée, celle qui est indiquée sous le nom "(par défaut)" au sein de l’éditeur de
registre.
L’exemple suivant ajoute une commande associée aux fichiers *.dll. Il commence par
récupérer le FriendlyName associé aux fichiers possédant l’extension *.dll puis écrit une
nouvelle clé correspondant à la nouvelle action et y stocke le nom du logiciel à exécuter lorsque
cette commande est invoquée par l’utilisateur. En occurrence, le logiciel RegSvr32.exe servira
à enregistrer automatiquement une librairie COM à l’extension *.dll au sein de la base de
registres :
Dim DLL, Sh
Set Sh = WScript.CreateObject("WScript.Shell")
DLL = Sh.RegRead("HKEY_CLASSES_ROOT\.dll\")
Sh.RegWrite "HKEY_CLASSES_ROOT\" & DLL & "\shell\" _
& "Enregistrer dans le registre\command\", "regsvr32.exe %1"
MsgBox "Les fichiers *.dll peuvent être enregistrés dans le " _
& registre", vbInformation, "Association réussie"
CH04\EnregistrerDLL.vbs
Dès lors, lorsque l’utilisateur activera le menu
contextuel sur un fichier *.dll, le menu
contextuel suivant lui sera affiché. Notez que
l’utilisateur peut désormais Enregistrer dans le
registre les différents fichiers *.dll.
DescoDev
4. Modèles d’objets de Windows Script Host
80
Gestion des variables d’environnement
Les variables d’environnement sont des chaînes de caractères contenant des informations
concernant le système associée à un nom symbolique et sont utilisées par le système
d’exploitation pour référencer différentes ressources : répertoires, lecteurs, nom de l’utilisateur ou
de l’ordinateur, etc.
À l’invite de
commandes,
tapez la
commande SET
afin de visualiser
la liste des
variables
d’environnement
de votre poste
ainsi que les
valeurs qui leurs
sont associées.
Les variables d’environnement sont regroupées au sein de trois grandes familles :
•
Les variables SYSTEM retournent des valeurs assignées au niveau du système
sans considération à l’utilisateur en cours.
•
Les variables USER retournent des valeurs concernant l’utilisateur en cours.
•
Les variables PROCESS retournent des valeurs concernant le processus en
cours. Ce sont les seules variables utilisables sous les systèmes 95, 98 et ME.
Lorsque vous désirez obtenir une référence vers une variable d’environnement, vous devez créer
un objet de type WshEnvironment contenant un tableau des variables d’environnement de la
famille spécifiée. Vous pouvez spécifier la famille de variables pour laquelle vous désirez obtenir
la variable. Cependant, cette dernière information est facultative. Si vous omettez cette
information, la variable d’environnement vous sera retournée sans considération à sa famille. Le
script suivant obtient le nombre de processeurs installés sur la machine en consultant la variable
d’environnement NUMBER_OF_PROCESSORS :
Set Ws = WScript.CreateObject("WScript.Shell")
Set SysEnv = Ws.Environment("SYSTEM")
MsgBox SysEnv("NUMBER_OF_PROCESSORS") & " processeurs."
DescoDev
4. Modèles d’objets de Windows Script Host
81
Voici la liste des variables d’environnement mises à votre disposition en Windows Script Host :
Variable
Description
NUMBER_OF_
PROCESSORS
PROCESSOR_
ARCHITECTURE
PROCESSOR_
IDENTIFIER
Nombre de processeurs en
cours sur la machine.
Type de processeur (x86,
Alpha, Mips)
Chaîne de caractères
identifiant le processeur.
Type de processeur
2 = 286
3 = 386
4 = 486
5 = Pentium
6 = Pentium Pro ou
Pentium II et plus
Numéro de révision du
processeur.
Chaîne de caractères
identifiant le système
d’exploitation.
Chemin du fichier
exécutable de l’invite de
commande habituellement
cmd.exe ou command.com
Lecteur local principal,
habituellement le C:\
Répertoire par défaut pour
les utilisateurs.
PROCESSOR_
LEVEL
PROCESSOR_
REVISION
OS
COMSPEC
HOMEDRIVE
HOMEPATH
PATH
PATHEXT
PROGRAMFILES
PROMPT
SYSTEMDRIVE
SYSTEMROOT
WINDIR
TEMP
TMP
Extension des fichiers
exécutables.
Emplacement du répertoire
des programmes,
habituellement le
c:\Program Files.
Invite de commande.
Lecteur hébergeant le
répertoire système,
généralement le C:\
Chemin du répertoire
système (c:\winnt).
Chemin du répertoire
système (c:\winnt).
Répertoire contenant les
fichiers temporaires.
Répertoire contenant les
fichiers temporaires.
SYSTEM
USER
PROCESS
NT/2000/XP
PROCESS
95/98/ME
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
-
x
x
-
-
x
-
-
-
x
-
x
x
x
x
x
-
x
-
x
x
x
x
-
-
x
x
-
-
x
-
-
-
x
-
x
-
x
x
-
x
x
x
-
x
x
x
DescoDev
4. Modèles d’objets de Windows Script Host
82
Les objets Scripting
Les objets Scripting permettent de manipuler les lecteurs, dossiers et fichiers du système.
Vous pouvez donc, à l’aide de ce modèle d’objets, créer, modifier ou supprimer des dossiers ou
des fichiers.
Objet
Ce que permet cet objet
Objet de base permettant d’accéder à l’ensemble des autres objets du
modèle.
Collection permettant d’accéder à l’ensemble des lecteurs du système
peu importe s’ils sont amovibles, fixes ou distants.
Accéder aux informations d’un lecteur spécifié.
Collection permettant d’accéder à l’ensemble des fichiers du dossier
spécifié.
Accéder aux informations d’un fichier spécifié.
Collection permettant d’accéder à l’ensemble des dossiers du lecteur
spécifié.
Accéder aux informations d’un dossier spécifié.
FileSystemObject
Drives
Drive
Files
File
Folders
Folder
TextStream
Lire et écrire des fichiers en format texte.
L’objet FileSystemObject
L’objet FileSystemObject est l’objet racine du modèle d’objets de Scripting et permet de créer
et d’accéder aux différents autres objets du modèle en plus d’inclure de manière redondante
plusieurs fonctionnalités de ces derniers dans le seul but de simplifier la programmation des
scripts.
Voici la liste complète des méthodes et des propriétés prévues par cet objet.
Propriété
Drives
Description
Retourne la collection d’objets
Drive représentant à chacun
d’eux un lecteur présent sur le
système.
Méthode
Description
BuildPath
Retourne un chemin valide
constitué de deux
expressions à concaténer.
CopyFile
Copie un ou plusieurs
fichiers à l’endroit spécifié.
CopyFolder
Copie un ou plusieurs
répertoires et son contenu
à l’endroit spécifié.
Exemple
Set FSO = _
CreateObject("Scripting." _
& "FileSystemObject")
Drv = FSO.Drives
Exemple
Chemin = FSO.BuildPath( d
"c:\temp", "dossier")
' Retourne c:\temp\dossier
FSO.CopyFile d
"c:\Documents\*.doc", d
"c:\dossier\"
FSO.CopyFolder d
"c:\Documents\*", d
"c:\dossier\"
DescoDev
4. Modèles d’objets de Windows Script Host
Crée le nouveau répertoire
spécifié.
Crée le fichier spécifié et
renvoie un objet
TextStream qui peut être
CreateTextFile
utilisé pour lire ou écrire
dans le fichier.
DeleteFile
Supprime le fichier spécifié.
Supprime le répertoire
DeleteFolder
spécifié.
Retourne True si le lecteur
DriveExists
spécifié existe et False
dans le cas contraire.
Retourne True si le fichier
FileExists
spécifié existe et False
dans le cas contraire.
Retourne True si le
répertoire spécifié existe et
FolderExists
False dans le cas
contraire.
Retourne un chemin valide
et absolu selon une
GetAbsolutePathName expression probablement
ambigu possédant des
caractères frimes.
Retourne un chemin de
dossier sans le nom de
GetBaseName
fichier à partir d’une
expression spécifiée.
Retourne un objet de type
Drive à partir d’un chemin
GetDrive
spécifié.
Retourne la lettre du
GetDriveName
lecteur correspondant au
chemin spécifié.
CreateFolder
GetExtensionName
Retourne l’extension du
fichier spécifié.
83
FSO.CreateFolder("c:\temp")
Set Fch = FSO.CreateTextFile(d
"c:\test.txt")
Fch.WriteLine "Test"
Fch.Close
FSO.DeleteFile "c:\test.txt"
FSO.DeleteFolder "c:\dossier"
If FSO.DriveExists("c:") Then
End If
If FSO.FileExists( d
"c:\test.txt") Then
End If
If FolderExists( d
"c:\dossier") Then
End If
chm=FSO.GetAbsolutePathName(d
"c:\*.*\docs")
' Retourne "c:\dossier\docs"
chemin ="c:\dossier\texte.txt"
chm=FSO.GetBaseName(chemin)
' Retourne "c:\dossier\"
drv = FSO.GetDrive("c:\")
MsgBox Drv.VolumeName
chemin ="c:\dossier\texte.txt"
drv = FSO.GetDriveName(chemin)
Fc = "c:\boot.ini"
Ext = FSO.GetExtensionName(Fc)
' Retourne "ini"
GetFile
GetFileName
GetFolder
Retourne un objet de type
File correspondant au
fichier du chemin spécifié.
Retourne le nom complet
du fichier sans le chemin à
partir d’une expression
spécifiée.
Retourne un objet de type
Folder correspondant au
chemin spécifié.
Retourne le nom du
GetParentFolderName dossier parent au dossier
spécifié.
Fch=FSO.GetFile("c:\boot.ini")
MsgBox Fch.DateCreated
chemin ="c:\dossier\texte.txt"
Fch=FSO.GetFileName(chemin)
MsgBox Fch
Fld=FSO.GetFile("c:\dossier\")
MsgBox Fld.DateCreated
Chemin = "c:\dossier\tmp"
Parent = d
FSO.GetParentFolderName(Chemin)
MsgBox Chemin & " appartient" _
& " au dossier " & Parent
DescoDev
4. Modèles d’objets de Windows Script Host
GetSpecialFolder
GetTempName
MoveFile
MoveFolder
OpenTextFile
Retourne un objet de type
Folder correspondant au
dossier spécial spécifié.
84
Set Fld = d
FSO.GetSpecialFolder(SystemFolder)
tmp = FSO.GetTempName()
Retourne un nom de fichier
aléatoire et unique pouvant
Set Fch = FSO.CreateTextFile(tmp)
servir de nom de fichier
Fch.WriteLine "Test"
temporaire.
Fch.Close
Déplace un fichier de la
FSO.MoveFile "c:\a.txt", d
source spécifiée à la
"d:\a.txt"
destination spécifiée.
Déplace un répertoire et
son contenu de la source
FSO.MoveFolder "c:\dossier\", d
"d:\dossier\"
spécifiée à la destination
spécifiée.
Ouvre le fichier spécifié et
Set Fch = FSO.OpenTextFile(d
renvoie un objet
"c:\fichier.txt")
TextStream qui peut être
Fch.WriteLine "Test"
utilisé pour lire ou écrire
Fch.Close
dans le fichier.
L’exemple suivant permet d’effectuer une sauvegarde (backup) du répertoire c:\inetpub\ en
un répertoire d:\backup\inetpub\. L’utilisation des objets FileSystemObject possède
l’avantage de créer le répertoire cible si ce dernier n’existe pas.
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFolder "c:\inetpub\*", "d:\Backup\inetpub\"
CH04\BackupFSO.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
85
L’objet Drive
L’objet Drive représente un lecteur physique ou réseau et peut être obtenu à partir de la
propriété Drives de l’objet FileSystemObject. On obtient une référence sur un lecteur à
l’aide de la lettre l’identifiant comme le démontre l’exemple suivant qui obtient un objet Drive
référençant le lecteur "c:" du système :
Dim Fso, Drv
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Drv = Fso.Drives("c")
Voici la liste complète des propriétés prévues par cet objet.
Propriété
AvailableSpace
DriveLetter
DriveType
FileSystem
FreeSpace
IsReady
Path
RootFolder
SerialNumber
Description
Exemple
Retourne le nombre d’octets
disponibles sur le lecteur. La valeur
nEspace = drv.AvailableSpace
peut différer de la propriété
MsgBox nEspace / 1024 & "Ko"
FreeSpace puisque celle-ci ne tient
pas compte des quotas appliqués à
l’utilisateur sur le lecteur.
If drv.IsReady Then
MsgBox drv.DriveLetter d
Retourne la lettre du lecteur.
& " est prêt!"
End If
If drv.DriveType = 4 Then
Retourne le type de lecteur. Voyez la
MsgBox "Impossible d’écrire d
liste des types possibles de lecteur
sur un support CD"
plus bas.
End If
Fs = drv.FileSystem
Retourne le système de fichiers
If LCase(fs)<> "ntfs" Then
utilisé sur le lecteur.
MsgBox "Le lecteur doit êtred
Peut retourner les valeurs "FAT",
en NTFS pour continuer."
"NTFS" ou "CDFS".
End If
Retourne le nombre d’octets
disponibles sur le lecteur. La valeur
Espace = drv.FreeSpace / 1024
peut différer de la propriété
MsgBox Espace " Ko disponibles"
AvailableSpace puisque celle-ci
tient compte des quotas appliqués à
l’utilisateur sur le lecteur.
If drv.IsReady = True Then
Retourne True si le lecteur est prêt
MsgBox drv.DriveLetter d
& " est prêt!"
et False dans le cas contraire.
End If
Retourne le chemin d’accès
MsgBox drv.Path
au lecteur.
Retourne un objet de type Folder
référençant la racine du lecteur.
Retourne le numéro de série du
MsgBox drv.SerialNumber
lecteur.
DescoDev
4. Modèles d’objets de Windows Script Host
ShareName
TotalSize
VolumeName
86
Retourne le nom de partage du
lecteur dans le cas d’un lecteur de
type réseau (DriveType = 3) ou
retourne une chaîne vide dans tous
les autres cas.
Retourne le nombre total d’octets du
lecteur.
Détermine ou retourne le nom de
volume du lecteur.
MsgBox drv.ShareName
nEspace = drv.FreeSpace / 1024
MsgBox nEspace " Ko total"
MsgBox drv.VolumeName
Voici la liste des types possibles de lecteurs retournés par la propriété DriveType :
Type de lecteur
Valeur
Inconnu
0
Disquette et périphérique amovible
1
Fixe
2
Lecteur réseau
3
CD-Rom et DVD-Rom
4
Disque virtuel
5
Le code suivant parcours l’ensemble des objets Drive disponibles dans la collection Drives du
FileSystemObject et en fait l’affichage du nom de volume et de l’espace disque disponible ou
du nom de partage le cas échéant :
Dim Fso, Drv, Dc, n, Capc, Disp
Set Fso = CreateObject("Scripting.FileSystemObject")
For Each Drv in Fso.Drives
If Drv.DriveType = 3 Then
n = Drv.ShareName
Else
If Drv.IsReady Then
n = Drv.VolumeName
Capc = Drv.TotalSize / 1024 / 1024 & " Mo"
Capc = vbCrLf & "Capacité: " & Capc
Disp = Drv.AvailableSpace / 1024 / 1024 & " Mo"
Disp = vbCrLf & "Disponible: " & Disp
Else
n = "< Non prêt >"
Capacite = ""
Disponible = ""
End If
End If
MsgBox Drv.DriveLetter & " - " & n & Capc & Disp
Next
CH04\Lecteurs.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
87
L’objet Folder
L’objet Folder représente un dossier obtenu par la méthode RootFolder de l’objet Drive ou
la méthode GetFolder de l’objet FileSystemObject. L’exemple suivant crée un objet de type
Folder représentant un dossier existant sur le système :
Dim Fso, Fld
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Fld = Fso.GetFolder("c:\program files\monDossier\")
Voici la liste complète des méthodes et des propriétés prévues par l’objet Folder.
Propriété
Description
Détermine ou retourne les
attributs du dossier. Voyez la
Attributes
liste des attributs possibles plus
loin.
Retourne la date de création du
DateCreated
dossier.
Retourne la date à laquelle le
DateLastAccessed dossier a été accédé pour la
dernière fois.
Retourne la date à laquelle le
DateLastModified dossier a été modifié pour la
dernière fois.
Retourne la lettre du lecteur
Drive
contenant le dossier.
Retourne une collection
contenant des objets File
Files
représentant l’ensemble des
fichiers du dossier.
Retourne si le dossier est le
IsRootFolder
dossier racine d’un lecteur.
Détermine ou retourne le nom
Name
du dossier.
Retourne un objet Folder
ParentFolder
représentant le dossier parent.
Retourne le chemin complet du
Path
dossier.
Retourne le nom du dossier
ShortName
sous le format compatible 8.3.
Retourne le chemin du dossier
ShortPath
sous le format compatible 8.3.
Retourne la taille en octets du
Size
contenu entier du dossier.
Retourne une collection
contenant des objets Folder
SubFolders
représentant l’ensemble des
sous-dossiers du dossier.
Retourne le type de dossier
Type
"Dossier de fichiers"
Exemple
Fld.Attributes = ReadOnly
MsgBox "Le dossier a été créé d
le " & Fld.DateCreated
MsgBox "Le dossier a été accédéd
le " & Fld.DateLastAccessed
MsgBox"Le dossier a été modifiéd
le " & Fld.DateLastModified
MsgBox "Le dossier se trouve d
sur le lecteur " & Fld.Drive
For Each Fl In Fld.Files
MsgBox Fl.Name
Next
If Fld.IsRootFolder Then
End If
MsgBox Fld.Name
MsgBox Fld.ParentFolder.Path
MsgBox Fld.Path
MsgBox Fld.ShortName
MsgBox Fld.ShortPath
MsgBox Fld.Size / 1024 & " Ko"
For Each subFld In Fld.SubFolders
MsgBox subFld.Name
Next
MsgBox Fld.Type
DescoDev
4. Modèles d’objets de Windows Script Host
Méthode
Copy
Delete
Move
Description
Copie le répertoire et son
contenu à l’endroit spécifié.
Supprime le répertoire.
Déplace le répertoire et son
contenu à la destination
spécifiée.
88
Exemple
Fld.Copy "c:\dossier\"
Fld.Delete
Fld.Move "d:\dossier\"
L’exemple suivant permet d’effectuer une sauvegarde (backup) du répertoire c:\inetpub\ en
un répertoire d:\backup\inetpub\.
Dim FSO, Fld
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FolderExists("d:\Backup\inetpub\") = False Then
FSO.CreateFolder "d:\Backup\inetpub\"
End If
Set Fld = FSO.GetFolder("c:\inetpub\")
Fld.Copy "e:\Backup\inetpub\"
CH04\BackupFolder.vbs
Manipulation des attributs
La propriété Attributes permet de déterminer ou de connaître les attributs des dossiers et des
fichiers par les biais des objets Folder et File. Les attributs possibles sont les suivants :
Attribut
Valeur
Description
Normal
0
Aucun attribut n’est défini.
ReadOnly
1
Le fichier ou le dossier est en lecture seule.
Hidden
2
Le fichier ou le dossier est caché.
System
4
Fichier système.
Volume
8
Étiquette de volume du lecteur.
Directory
16
Spécifie qu’il s’agit d’un dossier. Attribut en lecture seule.
Archive
32
Le fichier a été modifié depuis la dernière copie de sauvegarde.
Alias
64
Le fichier est un lien ou un raccourci. Attribut en lecture seule.
Compressed
128
Le dossier ou le fichier est compressé. Attribut en lecture seule.
DescoDev
4. Modèles d’objets de Windows Script Host
89
Cependant, si l’on tente de récupérer les attributs d’un dossier caché en lecture seule à l’aide du
script suivant :
Dim FSO, Fld
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Fld = FSO.GetFolder("c:\MonDossier")
MsgBox "Le dossier possède l’attribut " & Fld.Attributes
Nous obtiendrons le résultat suivant :
Or, il n’existe aucun attribut possédant la valeur 19. Ce surprenant résultat provient du fait qu’un
dossier ou un fichier peut se voir attribuer plusieurs attributs différents au sein de la même
propriété Attributes. Les différentes valeurs sont accumulées à l’aide de l’opérateur binaire
OR et sont dépilés à l’aide de l’opérateur binaire AND. Cette technique n’est pas propre à la
propriété Attributes et est utilisée à chaque fois qu’une propriété ou une variable peut se voir
attribuer plusieurs valeurs.
Le résultat 19 provient donc de l’accumulation de trois valeurs binaires. Considérant le tableau
suivant, si vous prenez chacune des valeurs des attributs Directory, Hidden et ReadOnly et
que vous les accumulez à l’aide d’une opération OR, vous obtiendrez le résultat 19 :
Attribut
Directory
Valeur
16
Hidden
2
ReadOnly
1
Résultat :
19
Valeur binaire
0000 1000
OR
0000 0010
OR
0000 0001
=
0000 1011
Maintenant, il est possible de savoir si un dossier ou un fichier est en lecture seule en dépilant le
la valeur ReadOnly du résultat 19 à l’aide d’une opération AND comme suit :
Attribut
Résultat
Valeur
19
ReadOnly
1
Résultat :
1
Valeur binaire
0000 1011
AND
0000 0001
=
0000 0001
Ainsi, si le résultat de l’opération AND vaut zéro (0), cela signifie que l’attribut ReadOnly ne s’y
retrouve pas. Sinon, le résultat sera égal à la valeur de l’attribut recherché, 1 selon notre
exemple.
DescoDev
4. Modèles d’objets de Windows Script Host
90
Voyez l’exemple complet suivant qui permet de connaître les attributs du dossier spécifié par
l’utilisateur.
Option Explicit
Dim FSO, Fld, strDossier, strAttributs
strDossier = InputBox("Spécifiez le chemin complet du dossier pour " _
lequel vous désirez connaître les attributs:")
If strDossier <> "" Then
Set FSO = CreateObject("Scripting.FileSystemObject")
'*************** Vérifie que le dossier existe vraiment **********'
If FSO.FolderExists(strDossier) Then
'********** Obtient un objet Folder sur le dossier ************'
Set Fld = FSO.GetFolder(strDossier)
'**************** Récupère les attributs **********************'
If Fld.Attributes AND 1 Then
strAttributs = "Dossier en lecture seule" & VbCrLf
End If
If Fld.Attributes AND 2 Then
strAttributs = strAttributs & "Dossier caché" & VbCrLf
End If
If Fld.Attributes AND 128 Then
strAttributs = strAttributs & "Dossier compressé" & VbCrLf
End If
MsgBox "Le dossier possède les attributs:" & vbCrLf & strAttributs
Else
MsgBox "Le dossier spécifié n'existe pas", vbExclamation
End If
End If
Ch04\attributs.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
91
L’objet File
L’objet File représente un fichier obtenu par la propriété Files de l’objet Folder ou la méthode
GetFile de l’objet FileSystemObject. L’exemple suivant crée un objet de type File
représentant un dossier existant sur le système :
Dim Fso, Fl
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Fl = Fso.GetFile("c:\program files\MonDossier\MonFichier.doc")
Voici la liste complète des méthodes et des propriétés prévues par l’objet File.
Propriété
Description
Détermine ou retourne les
attributs du fichier. Voyez les
Attributes
attributs possibles listés
précédemment.
Retourne la date de création du
DateCreated
fichier.
Retourne la date à laquelle le
DateLastAccessed fichier a été accédé pour la
dernière fois.
Retourne la date à laquelle le
DateLastModified fichier a été modifié pour la
dernière fois.
Retourne la lettre du lecteur
Drive
contenant le fichier.
Détermine ou retourne le nom
Name
du fichier.
Retourne un objet Folder
ParentFolder
représentant le dossier parent
contenant le fichier.
Retourne le chemin complet du
Path
fichier.
Retourne le nom du fichier sous
ShortName
le format compatible 8.3.
Retourne le chemin du fichier
ShortPath
sous le format compatible 8.3.
Retourne la taille en octets du
Size
fichier.
Type
Retourne le type de fichier.
Méthode
Copy
Delete
Move
OpenAsTextStream
Description
Copie le fichier à l’endroit
spécifié.
Supprime le fichier.
Déplace le fichier à la
destination spécifiée.
Obtient un objet TextStream
permettant d’accéder au
contenu du fichier.
Exemple
Fl.Attributes = ReadOnly
MsgBox "Le fichier a été créé d
le " & Fl.DateCreated
MsgBox "Le fichier a été accédéd
le " & Fl.DateLastAccessed
MsgBox"Le fichier a été modifiéd
le " & Fl.DateLastModified
MsgBox "Le fichier se trouve d
sur le lecteur " & Fl.Drive
MsgBox Fl.Name
MsgBox Fl.ParentFolder.Path
MsgBox Fl.Path
MsgBox Fl.ShortName
MsgBox Fl.ShortPath
MsgBox Fl.Size / 1024 & " Ko"
MsgBox Fl.Type
Exemple
Fl.Copy "c:\fichier.doc"
Fl.Delete
Fl.Move "d:\fichier.doc"
Voyez l’exemple complet plus loin dans la
description de l’objet TextStream.
DescoDev
4. Modèles d’objets de Windows Script Host
92
L’objet TextStream
L’objet TextStream représente le contenu d’un fichier en format texte brut. L’objet TextStream
permet au script d’ouvrir ou de créer un fichier texte afin d’en lire ou d’en altérer le contenu. Cet
objet est entre autre pratique pour permettre au script de stocker des informations de
configurations ou d’historiques.
On obtient un TextStream à l’aide de la méthode OpenAsTextStream de l’objet File ou à
l’aide de la méthode OpenTextFile de l’objet FileSystemObject. Les méthodes
OpenAsTextStream et OpenTextFile attendent des paramètres optionnels permettant de
spécifier le mode d’ouverture du fichier. Voici les prototypes complets correspondants à ces deux
méthodes :
FileSystemObject.OpenTextFile ( NomFichier [, ioMode [, ForceCreate [, Unicode ]]] )
File.OpenAsTextStream ( [ ioMode [, Format ]] )
L’argument ioMode représente le mode d’ouverture du fichier qui peut être l’une des trois valeurs
suivantes :
ioMode
Valeur
ForReading
1
ForWriting
2
ForAppending
8
Description
Le fichier est ouvert en lecture seule.
Le fichier est ouvert en écriture. Si un fichier existant porte le
même nom, sont contenu sera écrasé.
Le fichier est ouvert en ajout seulement.
L’argument Unicode représente la façon dont les caractères seront traités en lecture et écriture
au sein de ce fichier et peut être l’une des trois valeurs suivantes :
Unicode
Valeur
Description
UseDefault
-2
Utilise les paramètres par défaut du système.
True
-1
Traite les caractères en format Wide Unicode (16-bits).
False
0
Traite les caractères en format Ascii (8-bits).
L’exemple suivant crée un objet de type TextStream en ajout seulement et traitant les
caractères en format Unicode. Le fichier est créé s’il n’existe pas.
Dim Fso, Txt
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Txt = Fso.OpenTextFile("c:\MonFichier.txt", 8, True, True)
DescoDev
4. Modèles d’objets de Windows Script Host
93
Voici la liste complète des méthodes et des propriétés prévues par l’objet TextStream.
Propriété
AtEndOfLine
AtEndOfStream
Column
Line
Méthode
Close
Read
ReadAll
ReadLine
Skip
SkipLine
Write
WriteBlankLines
WriteLine
Description
Retourne True si le curseur du
fichier est situé juste avant la fin de
la ligne courante.
Retourne True si le curseur du
fichier est situé juste avant la fin du
fichier.
Retourne le numéro de colonne où
se trouve le curseur du fichier.
Retourne le numéro de ligne où se
trouve le curseur du fichier.
Description
Ferme le fichier précédemment
ouvert.
Lit le nombre de caractères spécifiés
à la position courante du curseur et
retourne la chaîne de caractères
résultante.
Lit le contenu entier du fichier et
retourne la chaîne de caractères
résultante.
Lit une ligne entière à la position
courante du curseur et retourne la
chaîne de caractères qui s’y trouvait.
Ignore le nombre spécifiés de
caractères et les exclu de la lecture
du fichier.
Ignore une ligne et l’exclue de la
lecture du fichier.
Écrit une chaîne de caractère dans
le fichier. Aucun saut de ligne n’aura
lieu si la chaîne spécifiée ne
possède pas de caractère de saut
de ligne.
Insère dans le fichier le nombre de
sauts de ligne spécifiés.
Exemple
Do Until Fichier.AtEndOfLine
st = Fichier.Read(1)
Loop
Do Until Fichier.AtEndOfStream
st = Fichier.ReadLine()
Loop
Do Until Fichier.Column > 25
Loop
Do Until Fichier.Line > 25
Loop
Exemple
Fichier.Close
Do Until Fichier.AtEndOfLine
st = Fichier.Read(1)
Loop
st = Fichier.ReadAll()
Do Until Fichier.AtEndOfStream
st = Fichier.ReadLine()
Loop
Fichier.Skip 10
' Saute 10 caractères
Fichier.SkipLine
Fichier.Write "allô" & vbCrLf
Fichier.WriteBlankLines 10
'Inscrit 10 lignes vides
Écrit une chaîne de caractère dans
le fichier. Un saut de ligne est
Fichier.WriteLine "allô"
automatiquement inséré après
l’écriture de la chaîne de caractères.
Le processus d’accès à un fichier est sensiblement le même dans tous les cas.
•
Le fichier doit d’abord être ouvert à l’aide d’une des méthodes OpenTextFile ou
OpenAsTextStream.
•
Le fichier peut être lu ou écrit à l’aide des méthodes Read et Write nommées ci-haut.
•
Le fichier est refermé à l’aide de la méthode Close expliquée ci-haut.
DescoDev
4. Modèles d’objets de Windows Script Host
94
L’exemple suivant récupère des informations auprès de l’utilisateur avant de stocker celles-ci au
sein d’un fichier. Remarquez comment le script détecte d’abord si le fichier existe ou non afin
d’afficher le contenu actuel du fichier.
Dim FSO, Txt, Fichier, stNom, stPrenom
Set FSO = CreateObject("Scripting.FileSystemObject")
'****************** Chemin du fichier *.ini ***********************'
Fichier = WScript.ScriptFullName
Fichier = Left(Fichier, InStrRev(Fichier, "\")) & "\infos.ini"
If FSO.FileExists(Fichier) Then
Set Txt = FSO.OpenTextFile(Fichier, 1)
stNom = Txt.ReadLine()
stPrenom = Txt.ReadLine()
Txt.Close
MsgBox "Bonjour " & stPrenom & " " & stNom
If MsgBox("Désirez-vous spécifier de nouvelles informations?", _
vbQuestion OR vbYesNo) = vbNo Then
WScript.Quit
End If
End If
'********************
stNom = ""
stPrenom = ""
Réinitialise les variables
******************'
'********** Récupère les informations de l'utilisateur *************'
Do While stNom = ""
stNom = InputBox("Entrez votre nom:")
If stNom = "" Then
If MsgBox("Quitter le script?", vbQuestion OR vbyesNo) = vbYes Then
WScript.Quit
End If
End If
Loop
Do While stPrenom = ""
stPrenom = InputBox("Entrez votre prénom:")
If stPrenom = "" Then
If MsgBox("Quitter le script?", vbQuestion OR vbyesNo) = vbYes Then
WScript.Quit
End If
End If
Loop
'************* Inscrit les informations dans un fichier *************'
Set Txt = FSO.OpenTextFile(Fichier, 2, True)
Txt.WriteLine stNom
Txt.WriteLine stPrenom
Txt.Close
CH04\FichierInfos.vbs
DescoDev
4. Modèles d’objets de Windows Script Host
95
Afin de clore ce survol des objets WSH et FileSystemObject, voici un exemple complexe
permettant de lancer la recherche d’un fichier sur les disques du système. L’exemple possède
l’avantage de récupérer le nom du fichier recherché au sein des arguments de la ligne de
commande ou, s’il ne s’y trouve pas, récupère l’information à l’aide d’une boîte de saisie.
Ensuite, le script utilise les objets FSO afin de parcourir astucieusement la totalité des lecteurs et
des répertoires s’y trouvant afin de trouver le fichier recherché et toutes ses occurrences
possibles.
Finalement, le script ouvre un fichier texte afin d’y stocker le résultat de la recherche et en
demande l’affichage avant de quitter.
Option Explicit
Dim Fso, Drv, K, Filename, Txt, stResultat, Fichier
Set FSO = CreateObject("Scripting.FileSystemObject")
'*********** Récupère le nom de fichier à rechercher
On Error Resume Next
Filename = WScript.Arguments(0)
**************'
'******* Si aucun argument spécifié à la ligne de commande *********'
If Filename = "" Then
Filename = InputBox("Entrez le nom du fichier à rechercher:")
If Filename = "" Then
WScript.Quit
End If
End If
'********** Parcours les lecteurs du système de A-Z
For K = Asc("a") To Asc("z")
If FSO.DriveExists(Chr(K)) Then
***************'
Set Drv = FSO.GetDrive(chr(k) & ":\")
If Drv.IsReady Then
FindFile Filename, FSO.GetFolder(chr(k) & ":\")
End If
End If
Next
Le code se poursuit à la page suivante
DescoDev
4. Modèles d’objets de Windows Script Host
96
'*********** Inscrit les résultats dans un fichier texte ***********'
Fichier = WScript.ScriptFullName
Fichier = Left(Fichier, InStrRev(Fichier, "\")) & "resultats.txt"
'********************* Ouverture du fichier
Set Txt = FSO.OpenTextFile(Fichier, 2, True)
***********************'
Txt.WriteLine "Résultat de la recherche du fichier '" & Filename & "'"
If Trim(stResultat) <> "" Then
Txt.Write "Le fichier a été trouvé:" & vbCrLf & vbCrLf & stResultat
Else
Txt.WriteLine "Le fichier n'a pu être trouvé. Il se peut qu'il se " _
& "trouve dans un répertoire à lequel vous ne possédez pas d'accès."
End If
'***********************
Txt.Close
Fermeture du fichier **********************'
'************************ Démarrage du fichier **********************'
CreateObject("WScript.Shell").Run "notepad " & Fichier
'********************************************************************'
'* FINDFILE
*'
'********************************************************************'
Function FindFile( ByVal Filename, ByVal Fld)
Dim Fl, stFichier
'*********** S’assure d’avoir un nom de fichier valide
If Right(Fld.Path, 1) = "\" Then
stFichier = Fld.Path & Filename
Else
stFichier = Fld.Path & "\" & Filename
End If
**********'
'***************** Teste si le fichier existe *********************'
If FSO.FileExists(stFichier) Then
stResultat = stResultat & " * " & stFichier & vbCrLf
Exit Function
End If
'***************** Récursivité sur les sous-répertoires ************'
For Each Fl In Fld.SubFolders
FindFile Filename, Fl
Next
End Function
CH04\Recherche.vbs
DescoDev
5. Techniques avancées de Script
97
5
Techniques avancées de Script
DescoDev
5. Techniques avancées de Script
98
5- Techniques avancées de Script
Nous avons vu au sein des précédents chapitres comment rédiger des scripts à l’aide du langage
VBScript et comment s’en servir pour piloter les objets WSH et Scripting. Cependant, on
pourrait sans trop de tort se poser la question suivante : « est-ce tout ce dont Windows Script
Host est capable ? »
Bien sûr que non. Il est sûr que nous avons vu l’ensemble du langage et des outils intrinsèques à
Windows Script Host. Cependant, il suffit de les utiliser afin d’accéder aux différentes ressources
du système pour voir WSH être capable de redémarrer le système, jouer des sons, créer un
compte dans Active Directory, accéder à une base de données, etc. Deux méthodes intrinsèques
aux objets Windows Script Host permettent d’ouvrir ces portes.
•
La méthode CreateObject possède l’avantage de pouvoir créer tout objet exposé par
la base de registre du système tel que nous l’avons constaté au chapitre 4. Ainsi, serait-il
possible de créer des instances d’Internet Explorer pour afficher des formulaires
complexes que l’utilisateur remplirait et que notre script récupérerait ensuite afin de
stocker ces informations au sein d’une base de données distante ? Serait-il possible de
se connecter au pare-feu de Windows XP afin d’en modifier les configurations?
Certainement. La seule difficulté réside dans le fait qu’il nous doit de connaître les
modèles d’objets concernés pour réaliser ce tour de force.
•
La méthode Run, quant à elle, possède l’avantage de pouvoir exécuter tout logiciel
présent sur le système y compris RunDLL32.exe, petit exécutable permettant d’accéder
à l’ensemble de l’API de Windows, c’est-à-dire toutes les fonctions utilisées par les
programmes compilés pour s’exécuter. La difficulté demeurera ici dans le fait qu’il se doit
de connaître ces fonctions, les paramètres qu’elles attendent et, non pas le moindre, les
effets (quelques fois dévastateurs) qu’elles peuvent avoir sur le système.
Quoiqu’il est hors de la prétention de cet ouvrage d’être une documentation complète des
différents modèles d’objets et de l’ensemble des fonctions API, voyons tout de même certains
trucs qui vous permettront de pousser plus loin l’efficacité et la convivialité de vos scripts.
DescoDev
5. Techniques avancées de Script
99
Piloter le pare-feu de Windows XP SP2
L’arrivée non sans tumultes du Service Pack 2 de Windows XP a amenée un pare-feu plus
performant et plus flexible. Le but du pare-feu de Windows XP SP2 est de bloquer les tentatives
non-sollicitées de communiquer avec le poste. Le pare-feu n’intervient pas sur les
communications originant du poste et ce, peu importe le port ou l’application responsable de la
communication.
Les objets permettant de piloter les configurations réseaux d’un poste XP SP2 sont contenus au
sein de l’objet HNetCfg. Cet objet permet d’accéder au pare-feu mais également au partage de
connexions Internet ICS, configurations avancées de Internet Explorer 6, etc.
Les objets permettant de piloter le pare-feu de Windows XP SP2 sont contenus au sein de l’objet
HNetCfg.FwMgr installé lors de l’installation du Service Pack 2. Ainsi, vos scripts pilotant le
pare-feu commenceront sensiblement comme suit :
Dim objFw
Set objFw = WScript.CreateObject("HNetCfg.FwMgr")
À partir de ce moment, la variable objFw référence le gestionnaire du pare-feu du poste local et
pourra être utilisée afin de le piloter.
Une erreur sera soulevée si votre script est exécuté sur un poste ne possédant pas Windows XP
SP2. Il peut donc être sage de prévoir un gestionnaire d’erreurs approprié :
Dim objFw
On Error Resume Next
Set objFw = WScript.CreateObject("HNetCfg.FwMgr")
If Err.Number Then
MsgBox "Impossible de connecter le pare-feu."
WScript.Quit
End If
L’objet FwMgr expose les quelques membres suivants :
Propriété
CurrentProfileType
LocalPolicy
Description
Retourne un profil de configuration selon le type spécifié. Documentation
incomplète à ce jour.
Retourne un objet représentant les stratégies en cours sur le pare-feu.
Utilisez cet objet comme point central pour accéder aux propriétés
avancées du pare-feu.
Méthode
Description
RestoreDefaults
Restaure la configuration originale du pare-feu.
IsPortAllowed
Retourne si le port TCP ou UDP précisé en paramètre est autorisé.
IsICMPTypeAllowed Retourne si le type ICMP précisé en paramètre est autorisé.
DescoDev
5. Techniques avancées de Script
100
L’exemple simple suivant permet de restaurer les configurations originales du pare-feu :
Dim objFw
On Error Resume Next
Set objFw = WScript.CreateObject("HNetCfg.FwMgr")
If Err.Number Then
MsgBox "Impossible de connecter le pare-feu."
WScript.Quit
End If
objFw.RestoreDefaults
CH05\FW\FW RestaurerDefaut.vbs
La propriété LocalPolicy de l’objet FwMgr expose l’ensemble des stratégies appliquées au
pare-feu sous forme d’un autre objet du type FwPolicy. Ce dernier objet expose une seule
propriété, CurrentProfile, qui retourne un objet de type FwProfile.
Quoique cela semble compliqué au premier abord, retenez simplement le script suivant qui
permet d’accéder aux propriétés du pare-feu de Windows XP SP2.
Dim objFw, objPrfl
On Error Resume Next
Set objFw = WScript.CreateObject("HNetCfg.FwMgr")
If Err.Number Then
MsgBox "Impossible de connecter le pare-feu."
WScript.Quit
End If
Set objPrfl = objFw.LocalPolicy.CurrentProfile
À partir de ce point, la variable objPrfl permettra d’accéder aux configurations du pare-feu.
La nature de l’objet FwProfile est encore obscure puisque la documentation officielle est encore incomplète
à ce sujet mais il semblerait que Microsoft prévoit de mettre en place plusieurs profils qui contiendraient des
configurations différentes. Ces profils seraient du type profil local, profil de domaine, profil par défaut, etc.
DescoDev
5. Techniques avancées de Script
101
L’objet FwProfile retourné par la propriété CurrentProfile expose les propriétés suivantes:
Propriété
Description
Retourne une collection d’objets FwAuthorizedApplication
représentant chacun une application autorisée par le pare-feu.
Retourne une collection d’objets FwAuthorizedApplication représentant
ExceptionsNotAllowed
une application autorisée par le pare-feu.
FirewallEnabled
Détermine/Retourne si le pare-feu est activé.
AuthorizedApplications
Retourne une collection d’objets FwOpenPort représentant chacun un
port TCP ou UDP autorisé ainsi que les adresses IP concernées.
Retourne un objet FwIcmpSettings représentant les configurations
IcmpSettings
du pare-feu concernant le protocole ICMP.
Détermine/Retourne si les notifications lancées lorsqu’une exception
NotificationsDisabled
est rencontrée sont activées.
Retourne un objet FwRemoteAdminSettings représentant les
RemoteAdminSettings
configurations de l’administration distante.
Retourne une collection d’objets FwService représentant chacun un
Services
service (port + étendue) autorisé par le pare-feu.
Retourne le type de profil concerné par l’instance FwProfile en cours
Type
(domaine, locale, défaut).
GloballyOpenPorts
Activer et désactiver le pare-feu de Windows XP SP2
Le pare-feu ICF de Windows XP SP2 peut être
activé ou désactivé à partir des propriétés des
connexions réseau. Votre script peut activer et
désactiver le pare-feu en altérant la valeur de la
propriété FirewallEnabled de l’objet
FwProfile retourné par la propriété
CurrentProfile.
Le script suivant active et désactive le pare-feu
selon son état actuel. Ainsi, le pare-feu est
désactivé s’il était activé et vice-versa.
Dim objFw, objPrfl
On Error Resume Next
Set objFw = WScript.CreateObject("HNetCfg.FwMgr")
If Err.Number Then
MsgBox "Impossible de connecter le pare-feu."
WScript.Quit
End If
Set objPrfl = objFw.LocalPolicy.CurrentProfile
objPrfl.FirewallEnabled = Not objPrfl.FirewallEnabled
MsgBox "Pare-feu activé : " & objPrfl.FirewallEnabled
CH05\FW\FW Activation.vbs
DescoDev
5. Techniques avancées de Script
102
Autoriser et enlever des applications
Lorsque le pare-feu ICF de Windows XP SP2 est activé,
l’ensemble des communications IP sont gérées par le parefeu. Cependant, Windows XP SP2 permet à des
programmes spécifiques de communiquer par le biais du
pare-feu peu importe le protocole et le port sollicité. Votre
script peut autoriser une application de communiquer via le
pare-feu en accédant à la collection
AuthorizedApplications de l’objet FwProfile
retourné par la propriété CurrentProfile.
En ce faisant, votre script pourra récupérer la liste des
applications autorisées ou encore utiliser la méthode Add
afin d’y ajouter un objet AuthorizedApplication
préalablement instancié et configuré.
'******** Instanciation d’une application autorisée ************'
Set objApp = CreateObject("HNetCfg.FwAuthorizedApplication")
L’objet FwAuthorizedApplication expose les propriétés suivantes :
Propriété
Description
Enabled
Valeur booléenne activant ou désactivant l’application.
Détermine/Retourne la version de protocole IP prise en charge (non
pris en charge pour l’instant. Ne pas utiliser).
Nom de l’application tel qu’il sera affiché au sein de la liste des
applications de la boîte de dialogue de configuration du pare-feu.
Chemin complet de l’exécutable autorisé. Le chemin doit être complet
mais peut contenir des variables d’environnement.
Détermine/Retourne la liste des adresses IP distantes autorisées à
utiliser cette application. Il est possible de spécifier toute adresse IP en
spécifiant simplement un astérisque (*). Si l’astérisque est spécifié,
seule cette valeur doit être spécifiée. Sinon, des adresses séparées les
unes des autres par un point-virgule (;) peuvent être spécifiées.
Spécifiez le masque de sous-réseau après chaque adresse en le
précédant d’une barre oblique (/).
IpVersion
Name
ProcessImage
FileName
RemoteAddresses
Exemple : 10.10.0.2/255.0.0.0;10.10.0.2/8
Détermine/Retourne une étendue d’adresses IP distantes autorisées à
utiliser cette application. Les valeurs numériques possibles sont :
Scope
0 = Toutes (défaut)
1 = Sous-réseau local
DescoDev
5. Techniques avancées de Script
103
Le script suivant ajoute l’utilitaire NsLookup à la liste d’exceptions du pare-feu de Windows XP.
Option Explicit
Const NET_FW_SCOPE_ALL = 0
Const NET_FW_SCOPE_LOCAL_SUBNET = 1
'********* Création du gestionnaire du pare-feu **************'
On Error Resume Next
Set objFwMgr = CreateObject("HNetCfg.FwMgr")
If Err <> 0 Then
MsgBox "Impossible de connecter le pare-feu."
WScript.Quit
End If
Set objPrfl = objFw.LocalPolicy.CurrentProfile
'******* Création d’un objet AuthorizedApplication ***********'
Set objApp = CreateObject("HNetCfg.FwAuthorizedApplication")
objApp.Name = "NsLookup"
objApp.ProcessImageFileName = "%windir%\system32\nslookup.exe"
objApp.Scope = NET_FW_SCOPE_ALL 'Ou NET_FW_SCOPE_LOCAL_SUBNET
objApp.Enabled = True
'** Ajoute l’application dans les apps autorisées du profil **'
objProfile.AuthorizedApplications.Add objApp
CH05\FW\FW AutoriserNSLookup.vbs
Un script nommé FW AutoriserApp.vbs situé au sein du même répertoire permet d’autoriser
toute application pour laquelle le chemin complet est précisé en argument de ligne de
commande. L’unique différence entre ce script et celui précédemment présenté est que le chemin
de l’application ainsi que son nom sont récupérés dynamiquement à partir des paramètres
précisés à l’invite de commande.
Exemple de l’utilisation de ce script au sein duquel l’utilitaire nslookup.exe est ajouté aux
applications autorisées par le pare-feu :
FW AutoriserApp.vbs
nslookup
c:\windows\system32\nslookup.exe
DescoDev
5. Techniques avancées de Script
104
Autoriser et enlever des ports
Windows XP SP2 permet à des ports TCP et UDP
spécifiques de communiquer par le biais du pare-feu peu
importe l’application utilisée. Votre script peut autoriser les
diverses applications de communiquer via un port
spécifique du pare-feu en accédant à la collection
AuthorizedPorts de l’objet FwProfile retourné par la
propriété CurrentProfile.
En ce faisant, votre script pourra récupérer la liste des ports
autorisés ou encore utiliser la méthode Add afin d’y ajouter
un objet AuthorizedPort préalablement instancié et
configuré.
'************* Instanciation d’un port autorisé ***************'
Set objApp = CreateObject("HNetCfg.FwAuthorizedPort")
L’objet FwAuthorizedPort expose les propriétés suivantes :
Propriété
BuiltIn
Enabled
IpVersion
Name
Port
Protocol
RemoteAddresses
Description
Retourne une valeur booléenne spécifiant si le port est défini par le
système (propriété en lecture seule).
Valeur booléenne activant ou désactivant le port.
Détermine/Retourne la version de protocole IP prise en charge (non
pris en charge pour l’instant. Ne pas utiliser).
Nom du port tel qu’il sera affiché au sein de la liste des ports de la
boîte de dialogue de configuration du pare-feu.
Détermine/Retourne la valeur numérique entière indiquant le port TCP
ou UDP spécifié.
Détermine/Retourne la valeur numérique entière indiquant le protocole
IP concerné où TCP = 6 et UDP = 17.
Détermine/Retourne la liste des adresses IP distantes autorisées à
utiliser ce port. Il est possible de spécifier toute adresse IP en
spécifiant simplement un astérisque (*). Si l’astérisque est spécifié,
seule cette valeur doit être spécifiée. Sinon, des adresses séparées les
unes des autres par un point-virgule (;) peuvent être spécifiées.
Spécifiez le masque de sous-réseau après chaque adresse en le
précédant d’une barre oblique (/).
Exemple : 10.10.0.2/255.0.0.0;10.10.0.2/8
Détermine/Retourne une étendue d’adresses IP distantes autorisées à
utiliser ce port. Les valeurs numériques possibles sont :
Scope
0 = Toutes (défaut)
1 = Sous-réseau local
DescoDev
5. Techniques avancées de Script
105
Le script suivant ajoute le port 53 UDP (Services de résolution de noms DNS) à la liste
d’exceptions du pare-feu de Windows XP :
Option Explicit
Const NET_FW_SCOPE_ALL = 0
Const NET_FW_SCOPE_LOCAL_SUBNET = 1
'********* Création du gestionnaire du pare-feu **************'
On Error Resume Next
Set objFwMgr = CreateObject("HNetCfg.FwMgr")
If Err <> 0 Then
MsgBox "Impossible de connecter le pare-feu."
WScript.Quit
End If
Set objPrfl = objFw.LocalPolicy.CurrentProfile
'*********** Création d’un objet AuthorizedPort **************'
Set objPort = CreateObject("HNetCfg.FwAuthorizedPort")
objPort.Name = "DNS"
objPort.Port = 53
objPort.Protocol = 17 '*** UDP
objPort.Scope = NET_FW_SCOPE_ALL
objPort.Enabled = True
'Ou NET_FW_SCOPE_LOCAL_SUBNET
'***** Ajoute le port dans les ports autorisés du profil *****'
objProfile.AuthorizedPorts.Add objPort
CH05\FW\FW AutoriserDNS.vbs
Un script nommé FW AutoriserPort.vbs situé au sein du même répertoire permet d’autoriser
tout port et protocole précisés en argument de ligne de commande. L’unique différence entre ce
script et celui précédemment présenté est que le numéro de port, le protocole ainsi que son nom
sont récupérés dynamiquement à partir des paramètres précisés à l’invite de commande.
Exemple de l’utilisation de ce script au sein duquel le port 25 TCP (SMTP) ajouté aux ports
autorisés par le pare-feu :
FW AutoriserPort.vbs
SMTP
25
6
DescoDev
5. Techniques avancées de Script
106
Piloter des formulaires Html
L’une des lacunes de Windows Script Host réside dans l’affichage et la saisie d’informations
auprès de l’utilisateur. Les seules fonctions prévues demeurent la boîte de message (MsgBox) et
la boîte de saisie (InputBox) dont les fonctionnalités sont grandement limitées. Cependant,
Windows Script Host peut piloter Internet Explorer qui lui-même possède les fonctionnalités pour
piloter des formulaires Html. Ainsi, il serait possible à un script Windows Script Host de demander
l’affichage d’un formulaire comme le suivant duquel l’ensemble des informations seraient
récupérées avant d’être traitées par le script :
Créons d’abord le document Html permettant à l’utilisateur de saisir les informations désirées.
Puisqu’il ne s’agit pas ici d’un ouvrage portant sur le Html et les langages dérivés, nous nous
contenterons de l’essentiel. Disons simplement que les scripts WSH pourront accéder en lecture
et écriture aux balises <INPUT>, <TEXTAREA> et <SELECT> déposées à l’intérieur d’un
formulaire Html. Créez un nouveau fichier texte et renommez-le Demande.htm. Ouvrez votre
fichier à l’aide de Bloc-Note puis inscrivez-y le balisage de la page suivante avant de le
sauvegarder. Ceux qui maîtrisent leur Html pourront parfaire le code à leur goût.
DescoDev
5. Techniques avancées de Script
107
<BODY>
<FORM Name="frm">
<TABLE>
<TR>
<TD ALIGN="Right">Utilisateur:</TD>
<TD WIDTH="30%"><INPUT Name="txtUtilisateur" Disabled></TD>
<TD ALIGN="Right">Poste:</TD>
<TD WIDTH="30%"><INPUT Name="txtPoste" Disabled></TD>
</TR>
<TR>
<TD ALIGN="Right">Date:</TD>
<TD><INPUT Name="txtDate" Disabled></TD>
<TD ALIGN="Right">Heure:</TD>
<TD><INPUT Name="txtHeure" Disabled></TD>
</TR>
<TR>
<TD ALIGN="Right" VAlign="Top">Problème:</TD>
<TD ColSpan="3">
<TEXTAREA Name="txtProbleme" ROWS="5"></TEXTAREA>
</TD>
</TR>
<TR>
<TD ALIGN="Right">Gravité:</TD>
<TD ColSpan="3"><SELECT>
<OPTION Value="1">Faible</OPTION>
<OPTION Value="2" SELECTED>Moyenne</OPTION>
<OPTION Value="3">Haute</OPTION>
<OPTION Value="4">Très haute</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD ALIGN="Right" ColSpan="2"><P>&nbsp;</P>
<A HREF="">Envoyer</A>
<P>&nbsp;</P>
</TD>
<TD ColSpan="2"><P>&nbsp;</P>
<A HREF="">Annuler</A>
<P>&nbsp;</P>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
CH06\HTML\Demande Service\Demande.htm
DescoDev
5. Techniques avancées de Script
108
Lecture et écriture des valeurs des éléments du formulaire
L’affichage du document Html peut être ordonnée par le script en créant une instance du
navigateur Internet Explorer puis en lui demandant de naviguer à l’adresse du document désiré.
Vous remarquerez l’utilisation de WScript.Sleep afin de forcer le script à ne rien faire en
attendant qu’Internet Explorer soit dûment démarré. Ceci est nécessaire puisque le démarrage
de logiciels s’effectuent de manière asynchrone, c’est-à-dire que la prochaine ligne de code de
votre script pourrait s’exécuter avant même qu’Internet Explorer soit pleinement prêt puisqu’il
s’exécute dans un thread séparé de celui de Windows Script Host.
Dim objIE, objSH, objNT, Chemin
'*** Procède à la création de l’objet Internet Explorer ******'
Set objIE = WScript.CreateObject("InternetExplorer.Application")
'*** Détermine l’emplacement du fichier *.htm à afficher *****'
Set objSH = WScript.CreateObject("WScript.Shell")
Chemin = objSH.CurrentDirectory & "\"
'********* Attend que Internet Explorer s’affiche
Do While objIE.Busy
WScript.Sleep 200
Loop
'************** Charge le document *.htm
objIE.Navigate Chemin & "fichier.htm"
objIE.Visible = True
**********'
*******************'
Votre fichier Html s’affiche alors. Cependant, la valeur de certaines zones de texte peuvent être
spécifiées par le script lui-même : le nom de l’utilisateur, le nom du poste, la date de la demande
et l’heure de celle-ci. Il est possible d’accéder au contenu d’une zone de texte par le biais de la
propriété value de l’objet en précisant ce dernier avec son nom tel que vous l’avez spécifié à
l’aide de l’attribut Name au sein du document Html. Ainsi, les dernières lignes du code précédent
deviendraient celles-ci :
'************** Charge le document *.htm
objIE.Navigate Chemin & "fichier.htm"
*******************'
Set objNT = WScript.CreateObject("WScript.Network")
objIE.Document.frm.txtPoste.value = objNT.ComputerName
objIE.Document.frm.txtUtilisateur.value = objNT.UserName
objIE.Document.frm.txtDate.value = Date()
objIE.Document.frm.txtHeure.value = Time()
objIE.Visible = True
DescoDev
5. Techniques avancées de Script
109
Spécifier les attributs d’affichage du formulaire Html
Il est possible au script de spécifier différents attributs de l’affichage de la page web servant de
formulaire de saisie tels que la largeur, la hauteur, la position et autres attributs esthétiques. Vous
pouvez spécifiez la position et les dimensions de la fenêtre d’Internet Explorer en accédant à
différentes propriétés de l’instance de celui-ci :
Propriété
Description
Height
Hauteur de la fenêtre. Minimum 100 pixels.
Left
Position de la gauche de la fenêtre.
Top
Position du haut de la fenêtre.
Width
Largeur de la fenêtre. Minimum 100 pixels.
Notez que les coordonnées et dimensions sont spécifiées en pixels.
Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Width = 550
objIE.Height = 550
objIE.Left = 100
objIE.Top = 100
objIE.Visible = True
Les autres attributs disponibles permettent de spécifier si la barre d’outils standard du navigateur
doit être affichée, la barre d’état, la barre de menu, etc. Les valeurs possibles sont False ou
True ou encore 0 et 1.
Propriété
Description
MenuBar
Spécifie si la barre de menu doit être affichée.
ToolBar
Spécifie si la barre d’outils doit être affichée.
StatusBar
Spécifie si la barre d’état doit être affichée.
Spécifie si la fenêtre peut être dimensionnée. Semble évidemment
causer des problèmes d’affichage lorsque appliqué sur Internet
Explorer 6.0 et les versions antérieures.
Resizable
Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.StatusBar = False
objIE.MenuBar = False
objIE.ToolBar = False
objIE.Visible = True
DescoDev
5. Techniques avancées de Script
110
Accéder aux variables définies au sein de la page Html
Les pages Html peuvent incorporer du script VBScript tel que celui que nous avons utilisé avec
Windows Script Host. La différence réside dans le fait que l’hôte est Internet Explorer au lieu
d’être WScript.exe et que, conséquemment, les modèles d’objets disponibles ne sont pas les
mêmes. Un script est inséré au sein d’une page Html à l’aide de la balise <Script> comme suit:
<BODY>
<SCRIPT Language="VBScript">
</SCRIPT>
</BODY>
Ainsi, le code inséré entre les deux balises <Script> sera interprété comme un code VBScript
inséré dans un fichier *.vbs. Le but de notre opération est d’y définir une variable qui spécifiera à
notre script si l’utilisateur a appuyé sur le bouton ‘Envoyer’ ou non.
<BODY>
<SCRIPT Language="VBScript">
Public Pret
Pret = 0
</SCRIPT>
</BODY>
...
<TR>
<TD ALIGN="Right" ColSpan="2"><P>&nbsp;</P>
<A HREF="" onClick="Pret = 1">Envoyer</A>
<P>&nbsp;</P>
</TD>
<TD ColSpan="2"><P>&nbsp;</P>
<A HREF="" onClick="Pret = 2">Annuler</A>
<P>&nbsp;</P>
</TD>
</TR>
Finalement, nous spécifions la valeur que doit prendre la variable Pret sur le click des différents
liens 'Envoyer' et 'Annuler'.
Ainsi, notre script attendra que la variable Pret soit différente de zéro et alors il saura que
l’utilisateur désire envoyer la demande de service. Notre script WSH devra donc inclure la boucle
suivante lui permettant d’attendre le click d’un bouton du formulaire Html avant de continuer son
exécution. Souvenez-vous que ces prouesses sont nécessaires puisque les deux applications
s’exécutent de manière asynchrone :
Do
Loop While objIE.Document.Script.Pret = 0
Certains connaisseurs en Html diront peut-être que nous aurions pu utiliser la méthode
window.close() intrinsèque au modèle d’objets de Html pour signifier que l’utilisateur désire
quitter le formulaire Html mais cette méthode possède le désavantage de détruire l’instance du
navigateur. Il est alors impossible à notre script de récupérer les valeurs saisies dans les zones
de texte puisque le navigateur n’existe plus.
DescoDev
5. Techniques avancées de Script
111
Voici le code complet du script Windows Script Host permettant d’afficher le formulaire Html et
d’en attendre les valeurs saisies par l’utilisateur. Les informations sont ensuite envoyées à
l’administrateur réseau par le biais de messagerie réseau (net send). Vous devrez changer le
destinataire du message indiqué en gras dans le code.
Dim objIE, objNT, Texte, Chemin
'***** Procède à la création de l’objet Internet Explorer *******'
Set objIE = WScript.CreateObject("InternetExplorer.Application")
Set objNT = WScript.CreateObject("WScript.Network")
'******* Détermine l’emplacement du fichier *.htm à afficher ****'
Chemin = objNT.CurrentDirectory() & "\"
'************* Attend que Internet Explorer s’affiche
Do While objIE.Busy
WScript.Sleep 200
Loop
*********'
'********************* Charge le document *.htm ***************'
objIE.Navigate Chemin & "demande service/demande.htm"
objIE.Width = 550
objIE.Height = 550
objIE.ToolBar = False
objIE.MenuBar = False
objIE.StatusBar = False
'******************* Rempli les informations connues **********'
objIE.Document.frm.txtPoste.value = objNT.ComputerName
objIE.Document.frm.txtUtilisateur.value = objNT.UserName
objIE.Document.frm.txtDate.value = Date()
objIE.Document.frm.txtHeure.value = Time()
objIE.Visible = True
'********* Attend que l'utilisateur appuie sur un bouton *********'
Do
WScript.Sleep 100
Loop Until objIE.Document.Script.Pret = 0
'*************** Utilisateur a appuyé sur 'Envoyer' **************'
If objIE.Document.Script.Pret = 1 Then
Texte = objIE.Document.frm.txtUtilisateur.value _
& " a un problème sur le poste " _
& objIE.Document.frm.txtPoste.value & vbCrLf _
& "Problème: " & objIE.Document.frm.txtProbleme.value & vbCrlf _
& "Gravité: " & objIE.Document.frm.cmbGrave.value
CreateObject("WScript.Shell").Run "net send AdminDomaine " & Texte
End If
objIE.Quit
CH06\HTML\Demande Service.vbs
DescoDev
5. Techniques avancées de Script
112
Voici l’exemple Recherche.vbs présenté au chapitre précédent qui permet de rechercher les
différences occurrences d’un fichier sur le(s) disque(s) du système. Certaines améliorations y ont
été apportées. Le script provoque l’affichage d’une page web et y affiche le fichier recherché sur
les disques du système ainsi que le répertoire en cours de recherche.
Dim objFSO, objDrv, K, Filename, objIE, stResultat, AfficherWeb
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'********** Récupère le nom de fichier à rechercher
On Error Resume Next
Filename = WScript.Arguments(0)
On Error goto 0
***************'
'***** Si aucun argument spécifié à la ligne de commande **********'
If Filename = "" Then
Filename = InputBox("Entrez le nom du fichier à rechercher:")
If Filename = "" Then
WScript.Quit
End If
End If
AfficherPageWeb
'********** Parcours les lecteurs du système de A-Z ***************'
On Error resume next
For K = Asc("a") To Asc("z")
If objFSO.DriveExists(Chr(K)) Then
Set objDrv = objFSO.GetDrive(chr(k) & ":\")
If objDrv.IsReady Then
FindFile Filename, objFSO.GetFolder(chr(k) & ":\")
End If
End If
Next
'******************* Résultat de la recherche *********************'
If Trim(stResultat) <> "" Then
MsgBox "Le fichier a été trouvé:" & vbCrLf & vbCrLf & stResultat
Else
MsgBox "Le fichier n'a pu être trouvé.", vbExclamation
End If
'************ Dissimule la page web si elle était affichée **********'
If AfficherWeb Then
objIE.Quit
Set objIE = Nothing
End If
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
113
Function FindFile( ByVal Filename, ByVal Fld)
Dim objFl, stFichier
'******* Affiche le répertoire en cours de recherche ***********'
If AfficherWeb Then oIE.Document.frm.inp.value = Fld.Path
If Right(Fld.Path, 1) = "\" Then
stFichier = Fld.Path & Filename
Else
stFichier = Fld.Path & "\" & Filename
End If
'*************** Teste l’existence du fichier ******************'
If objFSO.FileExists(stFichier) Then
stResultat = stResultat & " * " & stFichier & vbCrLf
Exit Function
End If
'********* Récursivité sur l’ensemble des sous-dossiers **********'
For Each objFl In Fld.SubFolders
FindFile Filename, Fl
Next
End Function
Sub AfficherPageWeb()
Dim Chemin
If MsgBox("Désirez-vous visualiser le nom des répertoires " _
& "recherchés en cour d'exécution?", vbYesNo) = vbNo Then
Exit Sub
End If
Chemin = CreateObject("WScript.Shell").CurrentDirectory & "\"
If objFSO.FileExists(Chemin & "recherche\recherche.htm") Then
Set objIE = WScript.CreateObject("InternetExplorer.Application")
'*********** Attend que Internet Explorer s’affiche **********'
Do While objIE.Busy
WScript.Sleep 200
Loop
objIE.Navigate Chemin & "recherche\recherche.htm"
objIE.Width = 550
objIE.Height = 200
objIE.MenuBar = False
objIE.StatusBar = False
objIE.ToolBar = False
objIE.Document.frm.fichier.value = Filename
objIE.Visible = True
AfficherWeb = True
End If
End Sub
CH06\HTML\Recherche.vbs
DescoDev
5. Techniques avancées de Script
114
Possibilités de WScript.Run
La commande Run de l’objet WScript.Shell possède l’avantage de pouvoir exécuter tout
logiciel présent sur le système en précisant son chemin mais peut également exécuter toute
commande ou logiciel résident aussi simplement qu’il nous est possible de le faire à l’invite de
commande DOS. Cette méthode donne donc la possibilité aux scripts Windows Script Host
d’étendre leurs capacités.
Planifier l’exécution d’un script
L’exécution d’un script peut être planifiée en ajoutant celui-ci à la liste de tâches planifiées de
Windows. Une tâche planifiée peut être créée à l’aide de l’assistant ou à l’invite de commande à
l’aide de la commande AT. Cette commande possède les prototypes suivants :
AT [\\ordinateur] [[id] [/DELETE]|/DELETE [/YES]]
AT [\\ordinateur] heure [/INTERACTIVE]
[/EVERY:date[,...] | /NEXT:date[,...]] "commande"
Notez que toute commande de l’invite de commande peut être lancée à l’aide de la méthode
Run comme le démontre l’exemple qui suit :
Dim WShell, Chemin
Chemin = WScript.ScriptFullName
Chemin = Left(Chemin, InStrRev(Chemin, "\"))
Set WShell = WScript.CreateObject("WScript.Shell")
WShell.Run "AT 18:00:00 /interactive " & Chr(34) & chemin _
& "monScript.vbs" & Chr(34)
Ainsi, le fichier de script précisé sera automatiquement exécuté tous les jours à 18:00h. Notez
que le caractère 34 inséré intentionnellement au début et à la fin du nom et chemin du fichier de
script à exécuter représente des guillemets et sert à éviter le plantage du script dans le cas où le
chemin du script contiendrait des espaces. Une autre technique aurait été d’insérer quatre
guillemets de suite comme suit :
WShell.Run "AT 18:00:00 /interactive " & """" & chemin _
& "monScript.vbs" & """"
DescoDev
5. Techniques avancées de Script
115
Piloter l’affichage du panneau de configuration
Il peut souvent s’avérer utile d’afficher le panneau de configuration afin de permettre à l’utilisateur
d’y sélectionner les options de son choix. Quoiqu’aucune commande intrinsèque à Windows
Script Host ni à VBScript ne permette une telle prouesse, la méthode Run permet de lancer la
commande control.exe qui elle-même demande l’affichage du panneau de configuration. Par
exemple, le code suivant provoque l’affichage du calendrier et de la minuterie intégrée dans le
panneau de configuration de Windows :
Dim WShell
Set WShell = CreateObject("WScript.Shell")
WShell.Run "control.exe timedate.cpl,,0"
Les différents éléments du panneau de configuration sont
affichés à l’aide de fichiers *.cpl référençant chacun un des
icônes disponibles dans le panneau de configuration.
Ensuite, le premier paramètre précédé d’un symbole @
spécifie le panneau à afficher tandis que le second
paramètre spécifie l’index de l’onglet sur lequel amener
le focus par défaut. Les index des onglets sont précisés à
partir de zéro jusqu’au nombre d’onglets moins un.
Le tableau suivant décrit l’ensemble des combinaisons permettant l’affichage des différents
éléments du panneau de configuration :
Module
Nom
Index
Appwiz.cpl
-
0à3
Desk.cpl
-
0à3
Intl.cpl
-
0à4
Main.cpl
@0 à @5
0àx
MmSys.cpl
@0 à @1
0àx
SysDm.cpl
-
0à3
TimeDate.cpl
-
0à1
Description
Affiche la boîte de dialogue
Ajout/Suppression de
programmes.
Affiche la boîte de dialogue
Affichage.
Affiche la boîte de dialogue
Paramètres régionaux.
Affiche les boîtes de dialogue
Souris, Clavier et PCMCIA où
le nom représente la boîte de
dialogue à afficher.
Affiche la boîte de dialogue
Sons et multimédia.
Affiche la boîte de dialogue
Système.
Affiche la boîte de dialogue
Date/Heure.
Exemple
Appwiz.cpl,,0
Desk.cpl,,1
Intl.cpl,,2
Main.cpl, @0,1
Main.cpl, mouse,1
Mmsys.cpl, @0,1
Sysdm.cpl,,0
Timedate.cpl,,0
Ainsi, l’exemple suivant aurait pour effet d’afficher la boîte de dialogue permettant à l’utilisateur
de sélectionner son écran de veille :
Dim WShell
Set WShell = WScript.CreateObject("WScript.Shell")
WShell.Run "control.exe desk.cpl,,1"
DescoDev
5. Techniques avancées de Script
116
Accéder à l’API de Windows à l’aide de RunDll32.exe
L’ensembles des fonctionnalités de Windows sont stockées sous forme d’un ensemble de
fonctions nommé l’API de Windows. L’API (Application Programming Interface) permet aux
programmeurs C/C++, Visual Basic et autres d’accéder à l’ensemble des fonctions qu’utilise luimême le système d’exploitation. Ces fonctions ne peuvent être directement utilisées en Windows
Script Host mais le petit exécutable RunDll32.exe nous permet de tricher à ce niveau.
RunDll32.exe permet d’exécuter des fonctions emmagasinées au sein de librairies dynamiques
en spécifiant le nom du fichier *.DLL contenant la fonction désirée puis le nom de la fonction à
exécuter :
RunDll32.exe [chemin]\NomLibrairie.dll, NomFonction [Prm1][,PrmN]
L’exemple suivant exécute la fonction LockWorkStation contenue au sein de la librairie
user32.dll afin de verrouiller la station de travail d’un poste s’exécutant sous Windows 2000.
Remarquez qu’il peut s’avérer facultatif de spécifier le chemin complet du fichier *.DLL si ce
dernier se trouve dans le répertoire système du poste. Sinon, vous devrez spécifier le chemin
complet du fichier.
Dim WShell
Set WShell = WScript.CreateObject("WScript.Shell")
WShell.Run "RunDll32.exe user32.dll, LockWorkStation"
Prenez garde à la syntaxe du nom de la fonction à exécuter puisque l’exécution de fonctions API
est discriminant à la casse. Ainsi, la fonction lockworkstation n’est pas l’équivalent de la
fonction LockWorkStation.
Cet autre exemple invoque la boîte de
dialogue Copie de disquette à l’aide de la
fonction DiskCopyRunDll contenue dans la
librairie DiskCopy.dll :
Dim WShell
Set WShell = WScript.CreateObject("WScript.Shell")
WShell.Run "RunDll32.exe DiskCopy.dll, DiskCopyRunDll"
Puisqu’il est hors de la prétention du présent document de couvrir l’ensemble des fonctions API
du système Windows, les intéressés pourront se référer à l’aide MSDN de Microsoft ou à des
livres spécialisés afin d’approfondir le sujet.
DescoDev
5. Techniques avancées de Script
117
Thèmes de programmation divers
La présente section se veut simplement un ensemble de brèves notions accompagnées de brefs
scripts dans le seul but de vous donner des idées et afin de vous encourager à approfondir votre
découverte de Windows Script Host. Cependant, aucune véritable nouveauté ne sera abordée au
sein de cette section et tous les codes utiliseront des éléments que vous avez préalablement
acquis au long du présent ouvrage. Les codes qui suivent ont simplement la prétention de vous
faire découvrir divers modèles d’objets intrinsèques à la plupart des systèmes Windows.
Envoyer des courriers électroniques simples avec CDONTS
L’envoi de courriers électroniques s’effectue très simplement à l’aide des objets exposés par la
librairie CDONTS.DLL retrouvée sur l’ensemble des systèmes Windows 2000. Si votre système
ne possède pas la librairie nécessaire, copiez-la sur votre disque dur à partir du CD-Rom
d’accompagnement à partir du répertoire \Librairies\. Installez préférablement cette librairie
au sein du répertoire système (system ou system32) de votre poste. Ensuite, souvenez-vous
que vous devrez inscrire cette librairie auprès de la base de registres comme suit :
RegSvr32.exe
c:\winnt\system32\cdonts.dll
La librairie CDONTS (Collaborative Data Objects for
NT Services) permet d’envoyer des courriers
électroniques le plus simplement du monde. Puisque
vous faites face à un nouveau modèle d’objets,
examinez d’abord les objets exposés par la librairie.
Une Session établie par un utilisateur sur son compte
de message peut posséder un Inbox et un Outbox.
Chacun de ces dossiers possèdent une collection
Messages contenant des objets de type Message.
Chacun de ces messages, en envoi ou en entrée, peut
posséder des Attachments ou des Recipients
correspondant au(x) récipiendaire(s) du message.
L’objet NewMail, quant à lui, représente un courrier
électronique n’étant pas associé ni à la boîte de
réception de l’utilisateur ni à sa boîte d’envoi.
Les scripts suivants utilisent les objets CDONTS qui ne sont accessibles que sous Windows 2000 et 2003. Les
scripts suivants ne peuvent donc pas s’exécuter sous Windows 98 ou Windows XP.
Créez d’abord une référence sur l’objet NewMail afin de procéder à la création d’un message
électronique comme suit :
Dim Msg
Set Msg = WScript.CreateObject("CDONTS.NewMail")
DescoDev
5. Techniques avancées de Script
118
L’objet NewMail possède les propriétés et méthodes suivantes :
Propriété
Description
Spécifie la ou les adresse(s) destination en tant que copie conforme invisible
du message. Spécifiez-y des adresses valides ([email protected]).
Bcc
Différentes destinations peuvent être précisées en les séparant par des
points-virgules.
Spécifie le message même du courrier. Insérez-y des balises Html seulement
Body
si BodyFormat = CdoBodyFormatHTML.
Spécifie le format du message du courrier où CdoBodyFormatHtml = 0 et
CdoBodyFormatText = 1. Si le format du message utilise Html, les
BodyFormat
balises Html insérées au sein du message seront interprétées au lieu d’être
affichées textuellement comme lorsque le format utilise Text.
Spécifie la ou les adresse(s) destination en tant que copie conforme du
message. Spécifiez-y des adresses valides ([email protected]).
Cc
Différentes destinations peuvent être précisées en les séparant par des
points-virgules.
URL complet de base du message et de ses attachements. Cet URL est
ContentBase
utilisé pour ensuite insérer des éléments (images, fichiers) référencés à l’aide
d’une adresse relative.
ContentLocation URL complet du message et de ses attachements.
Spécifie l’adresse de provenance du message. Spécifiez-y une adresse de
From
messagerie valide ([email protected]).
Spécifie l’importance du courrier où Low=0, Normal=1 et High=2.
Importance
MailFormat
Subject
Spécifie le format du courrier où CdoMailFormatMime = 0 et
CdoMailFormatText = 1.
Value
Spécifie l’objet, le sujet, le titre du message.
Spécifie la ou les adresse(s) destination du message. Spécifiez-y des
adresses de messagerie valides ([email protected]). Différentes
destinations peuvent être précisées en les séparant par des points-virgules.
Spécifie la valeur arbitraire d’un entête Http à insérer au sein du message.
Méthode
Description
AttachFile
Ajoute un fichier attaché au courrier.
AttachURL
Ajoute un fichier attaché au courrier en tant que lien URL.
Send
Lance l’envoi du message.
SetLocaleIDs
Spécifie l’identificateur CodePage utilisé au sein du courrier.
To
La méthode Send demeure la technique la plus simple pour envoyer un courrier électronique.
Cette méthode supporte plusieurs paramètres facultatifs permettant de préciser la source du
courrier, sa destination, son message, son sujet, etc.
NewMail.Send [From][,To][,Subject][,Body][,Importance]
Notez que l’ensemble des paramètres sont insérés entre crochets et sont donc facultatifs.
Examinez à la page suivante un code utilisant la méthode Send pour envoyer un courrier.
DescoDev
5. Techniques avancées de Script
119
'****************************************************************'
'* Ce code effectue la sauvegarde d’un répertoire et envoi un
*'
'* courrier électronique lorsque celle-ci est complétée.
*'
'****************************************************************'
Dim FSO, Msg
Dim StSujet, StMsg
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set Msg = WScript.CreateObject("CDONTS.NewMail")
On Error Resume Next
FSO.CopyFolder "c:\inetpub\*", "d:\Backup\inetpub\"
'****************************************************************'
'* Défini le message selon s’il y a eu erreur ou non
*'
'****************************************************************'
If Err.Number Then
StSujet = "Échec de la sauvegarde"
StMsg = Err.Description
Else
StSujet = "Réussite de la sauvegarde"
StMsg = "La sauvegarde s’est complétée le " & Now()
End If
'****************************************************************'
'* Lance l’envoi du message
*'
'****************************************************************'
Msg.Send "[email protected]", "[email protected]", StSujet, StMsg
Une autre façon de faire demeure de préciser les valeurs pour chacune des propriétés
indispensables de l’objet NewMail avant d’invoquer la méthode Send sans préciser aucun
paramètre. Cette technique nécessite un plus grand nombre de lignes de code mais présente
l’avantage d’être plus aisément lisible et compréhensible.
If Err.Number Then
Msg.Subject = "Échec de la sauvegarde"
Msg.Body = Err.Description
Else
Msg.Subject = "Réussite de la sauvegarde"
Msg.Body = "La sauvegarde s’est complétée le " & Now()
End If
Msg.To = "[email protected]"
Msg.From = "[email protected]"
'****************************************************************'
'* Lance l’envoi du message
*'
'****************************************************************'
Msg.Send
DescoDev
5. Techniques avancées de Script
120
Manipuler une base de registres à distance
Les objets intrinsèques à Windows Script Host ne prennent pas en charge la manipulation de
registre à distance. Par contre, la librairie RegObj.dll expose les objets nécessaires à ces
opérations. Si votre système ne possède pas la librairie, copiez-la sur votre disque dur à partir du
CD-Rom d’accompagnement à partir du répertoire \Librairies\. Installez préférablement
cette librairie au sein du répertoire système (system ou system32) de votre poste. Ensuite,
souvenez-vous que vous devrez inscrire cette librairie auprès de la base de registres comme
suit :
RegSvr32.exe
c:\winnt\system32\regobj.dll
La librairie RegObj.dll expose trois objets principaux qui sont les suivants :
Objet
Registry
RegKey
RegValue
Description
Objet global permettant l’accès à une base de registres et aux fonctionnalités
permettant de créer une instance d’un objet Registry distant.
Représente une clé dans la base de registres et possède une collection de
sous-clés contenant également des objets de type RegKey.
Représente une valeur au sein d’une clé de la base de registres. La valeur
peut être de type Binary, DWord, String, etc.
Pour manipuler la base de registres d’un ordinateur distant, créez d’abord une référence sur
l’objet global Registry comme suit :
Dim objReg
Set objReg = WScript.CreateObject("RegObj.Registry")
Une fois que vous possédez une référence sur une instance de l’objet global de la librairie
RegObj, vous pouvez utiliser la méthode RemoteRegistry afin d’obtenir une autre référence
sur un nouvel objet Registry en spécifiant le nom du poste que vous désirez connecter sous
forme de chemin UNC. Notez que vous devez évidemment posséder les permissions NT
nécessaires pour connecter la base de registres de l’ordinateur spécifié.
Dim objReg, objDst
Set objReg = WScript.CreateObject("RegObj.Registry")
Set objDst = objReg.RemoteRegistry("\\NomPoste")
L’objet Registry ainsi obtenu permettra désormais d’obtenir une référence sur une clé de la
base de registres connectée à l’aide de l’une des méthodes parmi celles exposées par l’objet.
Méthode
Description
AddRootRegKey
Permet d’ajouter un alias vers une clé de base HKEY_.
Obtient un objet RegKey à partir d’une clé de base HKEY_ ou à partir d’un
pointeur de structure (Handle) fourni par l’API de Windows.
RegKeyFromString Obtient un objet RegKey à partir du chemin de la clé à connecter.
RegKeyFromHKey
RemoteRegistry
Obtient un objet Registry sur le registre du poste distant spécifié.
DescoDev
5. Techniques avancées de Script
121
L’exemple suivant permet d’obtenir un objet RegKey représentant la clé de registre
HKEY_USERS\.DEFAULT\Control Panel\Desktop contenant les différentes valeurs des
configurations d’affichage (schémas de couleurs, image de fond, etc) des utilisateurs du poste
connecté.
Dim objReg, objDst, objKey
Set objReg = WScript.CreateObject("RegObj.Registry")
Set objDst = objReg.RemoteRegistry("\\NomPoste")
Set objKey = objDst.RegKeyFromString("\HKEY_USERS\.DEFAULT\" _
& "Control Panel\Desktop")
Finalement, les différentes valeurs contenues au sein d’une clé du registre peuvent être obtenues
à l’aide de la collection RegValues tandis que la valeur par défaut de la clé peut être obtenue à
l’aide de la propriété RegValue. L’ensemble des sous-clés sont quant à elles obtenues à l’aide
de la collection SubKeys. Voici la liste des membres de l’objet RegKey :
Propriété
Description
FullName
Nom pleinement qualifié de la clé de registre référencée.
Obtient le pointeur de structure (Handle) de la clé référencée. Cette valeur
n’est utilisable qu’au sein de l’API de Windows.
Nom de la clé de registre référencée.
HKey
Name
Obtient un objet RegKey représentant la clé parent de la clé référencée.
Retourne NULL lorsque la clé est une clé HKEY_ de premier niveau.
Parent
SubKeys
Value
Values
Méthode
ParseKeyName
Obtient une collection des sous-clés de la clé actuellement référencée.
Obtient ou détermine les données de la valeur par défaut sous forme de
chaîne de caractères.
Obtient une collection d’objets RegValue contenues par la clé référencée.
Description
Traite une chaîne de caractères contenant le nom pleinement qualifié d’une
clé de registre et en retourne un objet RegKey correspondant.
L’ensemble des valeurs de la clé créée dans l’exemple précédant peut donc être récupéré et
affiché comme suit :
Dim objReg, objDst, objKey, objVal
Set objReg = WScript.CreateObject("RegObj.Registry")
Set objDst = objReg.RemoteRegistry("\\NomPoste")
Set objKey = objDst.RegKeyFromString("\HKEY_USERS\.DEFAULT\" _
& "Control Panel\Desktop")
For Each objVal In objKey.Values
MsgBox objVal.Name & " a la valeur " & CStr(objVal.Value)
Next
CH06\Liste RegValues.vbs
DescoDev
5. Techniques avancées de Script
122
Voici la liste des membres de l’objet RegValue :
Propriété
Name
Type
Value
Description
Nom de la valeur sous forme de chaîne de caractères. Vaut "" lorsque la
valeur référencée est la valeur par défaut.
Type de donnée de la valeur où rvNone = 0, rvString = 1,
rvExpandString= 2, rvBinary = 3, rvLong = 4 et rvMultiString = 7.
Donnée de la valeur sous forme de variant. Utilisez la conversion explicite
avant utilisation afin d’éviter les erreurs.
Méthode
Description
ChangeType
Change le type de données d’une valeur en un autre type de données.
Comme le démontre l’exemple suivant, il est possible d’obtenir une référence sur une valeur
spécifique en précisant le nom de la valeur à la collection Values de l’objet RegKey. Le script
suivant obtient le chemin du fond d’écran par défaut pour l’ensemble des utilisateurs d’un poste
distant.
Dim objReg, objDst, objKey, objVal
Set objReg = WScript.CreateObject("RegObj.Registry")
'***************************************************************'
'* Modifiez le nom du poste à connecter (sous forme de UNC).
*'
'***************************************************************'
Set objDst = objReg.RemoteRegistry("\\NomPoste")
'***************************************************************'
'* Spécifie la clé de registre à référencer.
*'
'***************************************************************'
Set objKey = objDst.RegKeyFromString("\HKEY_USERS\.DEFAULT\" _
& "Control Panel\Desktop")
'***************************************************************'
'* Obtient la donnée de la valeur Wallpaper.
*'
'***************************************************************'
Set objVal = objKey.Values("Wallpaper")
MsgBox "Fond d’écran : " & CStr(objVal.Value)
CH06\RegObj FondEcran.vbs
Les systèmes Windows 95/98 ne supportent pas l’accès distant à leur base de registres par défaut. Pour que
ces systèmes prennent en charge ces fonctionnalités, il est d’abord nécessaire d’y installer le composant
optionnel Remote Registry.
DescoDev
5. Techniques avancées de Script
123
Récupérer les configurations matérielles d’un poste avec WMI
WMI (Windows Management Instrumentation) est un modèle d’objets disponibles sous les
systèmes Windows utilisant la technologie NT qui permet de connecter des postes distants dans
le but d’y effectuer diverses opérations. La connexion à des postes distants s’effectue très
simplement à l’aide des objets exposés par la librairie wbemdisp.tlb retrouvée sur l’ensemble
des systèmes NT.
WMI est un modèle d’objets suffisamment complet pour le qualifier de modèle assez complexe
pour faire l’objet d’un ouvrage à lui seul. Par contre, il est possible de simplifier grandement
l’utilisation du modèle en prenant l’objet SWbemLocator pour point de départ commun à tout
script utilisant WMI. L’objet SWbemLocator permet de connecter le poste local ou un poste
distant afin d’y activer les fonctionnalités WMI.
Dim objLoc
Set objLoc = WScript.CreateObject("WbemScripting.SWbemLocator")
L’objet SWbemLocator possède une méthode ConnectServer permettant de connecter un
poste et la propriété Security_, référence vers un objet de type WbemSecurity que nous
n’étudierons pas dans le cadre du présent ouvrage.
La méthode ConnectServer attend que le script spécifie le nom NetBIOS ou adresse IP du
poste à connecter, nom d’utilisateur et mot de passe à utiliser pour la connexion, etc. et retourne
en échange un objet de type WbemServices représentant le service WMI s’exécutant sur le
poste distant spécifié. Cet objet sera celui que votre script devra utiliser afin de récupérer les
configurations logicielles du poste distant donc conservez-en jalousement la référence.
Dim objLoc, objSvc
Set objLoc = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSvc = objLoc.ConnectServer("nomPoste", , "admin", "12345")
Quoique l’objet WbemServices prévoie une pluralité de méthodes et de propriétés, nous
n’utiliserons que sa méthode InstancesOf permettant d’obtenir une instance d’une classe de
programmation WMI afin d’ultérieurement la piloter. Les classes sont obtenues en spécifiant une
chaîne de caractères unique correspondant à un élément logiciel ou matériel du système
connecté. L’exemple suivant récupère la liste des lecteurs de disquettes d’un poste distant :
Dim objLoc, objSvc, objFloppy
Set objLoc = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSvc = objLoc.ConnectServer("nomPoste", , "admin", "12345")
Set objFloppy = objSvc.InstancesOf("Win32_FloppyDrive")
L’objet retourné par l’utilisation de la méthode InstancesOf est de type SWbemObjectSet et
représente un ensemble d’éléments correspondants à la classe demandée, classe
Win32_FloppyDrive dans l’exemple qui nous concerne. Cet objet agi donc sous la forme
d’une collection et peut conséquemment posséder une référence sur plusieurs objets qu’il suffit
de parcourir afin d’en obtenir la liste complète. Par contre, prenez garde que chacun des
éléments de cette collection possède des propriétés et des méthodes différentes les un des
autres selon la classe invoquée.
DescoDev
5. Techniques avancées de Script
124
Dans le cas d’un objet répondant à la classe Win32_FloppyDrive, il est possible d’accéder aux
membres Manufacturer, Status, DeviceID et ConfigManagerErrorCode comme suit :
Dim objLoc, objSvc, objFloppy, objInst, stMsg
Set objLoc = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSvc = objLoc.ConnectServer("nomPoste", , "admin", "12345")
Set objFloppy = objSvc.InstancesOf("Win32_FloppyDrive")
For Each objInst In objFloppy
stMsg = Trim(objInst.Manufacturer)
stMsg = stMsg & vbCrLf & LCase(Trim(objInst.status)) = "ok"
stMsg = Trim(objInst.DeviceID)
MsgBox stMsg, vbInformation, "Floppy Drive"
Next
Voici la liste non exhaustive des principales classes d’accès au matériel de postes exécutant
Windows et WMI :
Classe
Description
Win32_BaseBoard
Obtient la description de la carte-mère du poste.
Win32_Battery
Obtient la description de(s) batterie(s) de sauvegarde (UPS).
Win32_CDRomDrive
Obtient la description de(s) lecteur(s)/graveur(s) de CD et DVD.
Win32_DesktopMonitor Obtient la description de(s) moniteur(s) relié(s) au poste.
Win32_DiskDrive
Obtient la description de(s) disque(s) dur(s) relié(s) au poste.
Win32_DiskPartition
Obtient la description de(s) partition(s) relié(s) au disque spécifié.
Win32_Keyboard
Win32_Network
Adapter
Win32_Operating
System
Win32_Physical
Memory
Obtient la description du clavier relié au poste.
Obtient la description de(s) carte(s) réseau reliée(s) au poste.
Obtient la description de(s) moniteur(s) relié(s) au poste.
Obtient la description de la mémoire vive reliée au poste.
Win32_Printer
Obtient la description de(s) appareils de pointage relié(s) au poste
(souris, stylet, etc).
Obtient la description de(s) imprimante(s) reliée(s) au poste.
Win32_Processor
Obtient la description de(s) processeur(s) relié(s) au poste.
Win32_Share
Obtient la description de(s) partage(s) disponible(s) sur le poste.
Win32_PointingDevice
Win32_VideoController Obtient la description de(s) carte(s) vidéo reliée(s) au poste.
DescoDev
5. Techniques avancées de Script
125
L’exemple complet qui suit invite l’utilisateur à saisir le nom NetBIOS ou l’adresse IP d’un poste
qu’il désire connecter. Ensuite, le script établi une connexion WMI et en retire plusieurs
informations concernant la configuration matériel avant de l’inscrire dans un fichier texte créé à la
racine du disque C:\ .
Dim FSO, Fichier, Machine, StMachineName
'********************** Nom de la machine ***************************'
StMachineName = InputBox("Entrez le nom de la machine à connecter.")
If StMachineName = "" Then WScript.Quit
'******************** Connexion à la machine ************************'
Set Machine = Connecter(StMachineName) 'Fonction Connecter() plus bas
If Machine Is Nothing Then WScript.Quit
'********************* Ouverture du fichier *************************'
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Fichier = FSO.CreateTextFile("c:\" & stMachineName & ".txt", True)
Fichier.WriteLine("INVENTAIRE DE " & UCase(StMachineName))
Fichier.WriteLine("====================================")
'**************************
DetectCPU Machine
Fichier.WriteLine(" ")
Détection
******************************'
DetectMotherboard Machine
Fichier.WriteLine(" ")
'Les fonctions Detect??? plus bas
DetectRAM Machine
Fichier.WriteLine(" ")
DetectHDD Machine
Fichier.WriteLine(" ")
DetectCDROM Machine
Fichier.WriteLine(" ")
DetectVideo Machine
Fichier.WriteLine(" ")
DetectAudio Machine
Fichier.WriteLine(" ")
DetectNet Machine
Fichier.WriteLine(" ")
DetectMouse Machine
Fichier.WriteLine(" ")
'******* Fermeture du fichier et MsgBox pour signaler la fin *********'
Fichier.Close
MsgBox "La détection est terminée sur " & StMachineName
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
126
Function Connecter(ByVal MachineName)
Dim objLocator, ObjService
On Error Resume Next
'************** Création de l'objet Locator ********************'
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
If Err.Number Then
MsgBox "Une erreur est survenue lors de la création de Locator."
Err.Clear
Exit Function
End If
'*********** Connexion à la machine MachineName ****************'
Set ObjService = objLocator.ConnectServer(MachineName)
ObjService.Security_.ImpersonationLevel = 3
'Impersonate
If Err.Number Then
MsgBox "Une erreur est survenue lors de la connexion."
Err.Clear
End If
Set Connecter = ObjService
End Function
'*********************************************************************'
Function DetectCDROM(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_CDRomDrive")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("LECTEURS CDROM\DVDROM")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Fichier.WriteLine("Manuf:
" & Trim(objInst.Manufacturer))
Fichier.WriteLine("Descr:
" & Trim(objInst.Description))
Fichier.WriteLine("DeviceID: " & Trim(objInst.DeviceID))
Fichier.WriteLine(" ")
Next
DetectCDROM = N
End Function
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
127
Function DetectAudio(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_SoundDevice")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("ADAPTEURS AUDIO")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Fichier.WriteLine("Produit: " & Trim(objInst.ProductName))
Fichier.WriteLine("DeviceID: " & Trim(objInst.PNPDeviceID))
Next
DetectAudio = N
End Function
'*********************************************************************'
Function DetectNet(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_NetworkAdapter")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("CARTE-RÉSEAU")
Fichier.WriteLine("====================================")
For Each objInst In objSet
St = LCase(Trim(objInst.Name))
If InStr(St, "miniport") <= 0 Then
If InStr(St, "ras async adapter") <= 0 And _
InStr(St, "carte asynchrone ras") <= 0 And _
InStr(St, "parallèle direct") <= 0 And _
InStr(St, "direct parallel") <= 0 Then
N = N + 1
Fichier.WriteLine(Trim(objInst.ProductName & ""))
Fichier.WriteLine(" ")
End If
End If
Next
DetectNet = N
End Function
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
128
Function DetectCPU(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_Processor")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("PROCESSEUR")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Fichier.WriteLine("Produit: " & Trim(objInst.Name) & " " _
& Trim(objInst.CurrentClockSpeed) & "MHz")
Next
DetectCPU = N
End Function
'*********************************************************************'
Function DetectMotherboard(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_BaseBoard")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("CARTE-MÈRE")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Fichier.WriteLine("Produit: " & Trim(objInst.Manufacturer) _
& " " & Trim(objInst.Product) & " " & Trim(objInst.Version))
Next
DetectMotherboard = N
End Function
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
129
Function DetectHDD(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_DiskDrive")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("DISQUE DUR")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Fichier.WriteLine("Produit: " & Trim(objInst.Model) & _
" (" & GetGOSize(objInst.Size) & ")")
Fichier.WriteLine(" ")
Next
DetectHDD = N
End Function
'*********************************************************************'
Function DetectMouse(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_PointingDevice")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("SOURIS")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Fichier.WriteLine("Produit: " & Trim(objInst.Name) & _
" (" & Trim(objInst.NumberOfButtons) & " boutons)")
Fichier.WriteLine(" ")
Next
DetectMouse = N
End Function
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
130
Function DetectVideo(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_VideoController")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("====================================")
Fichier.WriteLine("ADAPTEURS VIDÉO")
Fichier.WriteLine("====================================")
For Each objInst In objSet
N = N + 1
Select Case objInst.VideoArchitecture
Case 3 'CGA
St = "(CGA"
Case 4 'EGA
St = "(EGA"
Case 5 'VGA
St = "(VGA"
Case 6 'SVGA
St = "(SVGA"
Case 7 'MDA
St = "(MDA"
Case 8 'HGC
St = "(HGC"
Case 9 'MCGA
St = "(MCGA"
Case 10 '8514A
St = "(8514A"
Case 11 'XGA
St = "(XGA"
Case 12 'Linear Frame Buffer
St = "(Linear Frame Buffer"
Case 13 'PC-98
St = "(PC-98"
End Select
Select Case objInst.AcceleratorCapabilities
Case 2
St = St & "/Graphic Accelerator)"
Case 3
St = St & "/3D Accelerator)"
Case Else
St = St & ")"
End Select
Fichier.WriteLine("Produit: " & Trim(objInst.Caption) & St)
Fichier.WriteLine("DeviceID: " & Trim(objInst.PNPDeviceID))
Next
DetectVideo = N
End Function
Le code se poursuit sur la page suivante
DescoDev
5. Techniques avancées de Script
131
Function DetectRAM(ByRef ObjService)
Dim objFileSystem, objSet, obj, objInst, N
On Error Resume Next
Set objSet = ObjService.InstancesOf("Win32_PhysicalMemory")
If objSet.Count = 0 Then Exit Function
Fichier.WriteLine("MÉMOIRE RAM")
For Each objInst In objSet
N = N + 1
Select Case Trim(objInst.MemoryType & "")
Case "3", "4", "5"
St = "DRAM"
Case "6"
St = "EDO"
Case "7"
St = "EDRAM"
Case "8"
St = "VRAM"
Case "9"
St = "SRAM"
Case "10"
St = "RAM"
Case "11"
St = "ROM"
Case "12"
St = "Flash"
Case "13", "14", "15"
St = "EPROM"
Case "16"
St = "CDRAM"
Case "17", "18", "19"
St = "SDRAM"
End Select
Fichier.WriteLine("Mémoire: " & St)
St = GetGOSize(Trim(objInst.Capacity))
Mm = CLng(Left(St, Len(St) - 2))
If CLng(Mm) <= 10 Then
Mm = 8
ElseIf Mm <= 21 Then
Mm = 16
ElseIf Mm <= 45 Then
Mm = 32
ElseIf Mm <= 110 Then
Mm = 64
ElseIf Mm <= 170 Then
Mm = 128
ElseIf Mm <= 290 Then
Mm = 256
ElseIf Mm <= 600 Then
Mm = 512
End If
Fichier.WriteLine("Capacité: " & Mm & " Mo")
Fichier.WriteLine("Emplac.: " & Trim(objInst.DeviceLocator))
Next
DetectRAM = N
End Function
DescoDev
5. Techniques avancées de Script
132
Function GetGOSize(ByVal Sz)
Dim tmpSz
tmpSz = CDbl(Left(Sz, Len(Sz) - 3))
If CDbl(tmpSz / 1024) > 1000 Then
GetGOSize = FormatNumber(CStr((tmpSz / 1024) / 1024), 2) & "Go"
Else
GetGOSize = FormatNumber(CStr(tmpSz / 1024), 2) & "Mo"
End If
End Function
CH05\Inventaire.vbs
Vous aurez probablement remarqué que l’ensemble des fonctions Detect??? travaillent de
manière similaire : elles utilisent un objet WbemServices obtenu par le truchement de
l’exécution de la fonction Connecter et représentant une connexion WMI sur le poste distant
spécifié par l’utilisateur et s’en servent afin d’interroger une classe de matériel spécifique
(Win32_PhysicalMemory, Win32_DiskDrive, etc). Les informations obtenues à l’aide de la
méthode InstancesOf sont ensuite inscrites au sein du fichier Fichier créé au sein du
module principal du code. Vous remarquerez que l’ensemble des classes WMI utilisées
possèdent des propriétés qui peuvent différer de l’une à l’autre.
Classe
Propriétés
Win32_BaseBoard
ConfigOptions, HotSwappable, Manufacturer, Product, Version, etc.
Win32_Battery
BatteryRechargeTime, BatterieStatus, Manufacturer, Name, etc.
Win32_CDRomDrive
Description, DeviceID, Drive, Manufacturer, etc.
Win32_DesktopMonitor Bandwidth, DeviceID, DisplayType, MonitorType, Name, etc.
Win32_DiskDrive
BytesPerSector, InterfaceType, Model, Partitions, Size, TotalSectors
Win32_DiskPartition
Bootable, BootPartition, DeviceID, DiskIndex, PrimaryPartition, Size
Win32_Keyboard
Win32_Network
Adapter
Win32_Physical
Memory
Win32_PointingDevice
DeviceID, IsLocked, Layout, NumberOfFunctionKeys, etc.
Win32_Printer
Capabilities, DefaultPriority, Description, DriverName, etc.
Win32_Processor
Architecture, Name, CurrentClockSpeed, L2CacheSize, etc.
Win32_SoundDevice
DMABufferSize, MPU401Address, ProductName, PNPDeviceID, etc.
AdapterType, Description, Name, ProductName
Capacity, DeviceLocator, MACAddress, MemoryType
DeviceInterface, Name, NumberOfButtons, PointingType, etc.
Win32_VideoController AcceleratorCapabilities, Caption, PNPDeviceID, VideoArchitecture, etc
DescoDev
6. Environnement d’exécution des Scripts
133
6
Environnement d’exécution des
Scripts
DescoDev
6. Environnement d’exécution des Scripts
134
6- Environnement d’exécution des Scripts
Puisque Windows Script Host est un langage de script d’abord conçu pour l’administration de
systèmes, cette dernière section se penche sur les éléments de l’environnement reliés à
l’exécution des scripts.
Créer des scripts de démarrage
Il peut être pratique pour un administrateur réseau de créer un script s’exécutant
automatiquement à l’ouverture de session de ses utilisateurs afin de connecter les différents
lecteurs réseau et imprimantes, etc. Pour ce faire, vous devez d’abord créer le script et le
déposer dans un répertoire précis.
Sous un poste de travail NT 4 et 2000, le fichier
de script doit être déposé dans le répertoire :
\winnt\system32\repl\import\scripts
Démarrez ensuite l’outil d’administration du
système et localisez l’utilisateur ou le groupe
concerné avant d’en afficher les propriétés.
Sélectionnez ensuite l’onglet Profil et
spécifiez le nom de ce fichier de script à
exécuter à l’ouverture de la session.
DescoDev
6. Environnement d’exécution des Scripts
135
Sous un contrôleur de domaine NT 4, le fichier
de script doit être déposé dans :
\winnt\system32\repl\import\scripts
Sous un contrôleur de domaine 2000, le fichier
de script doit être déposé dans :
\winnt\sysvol\domain\scripts\
Localisez ensuite l’utilisateur ou le groupe
concerné et en afficher les propriétés.
Sélectionnez ensuite l’onglet Profil et
spécifiez le nom de ce fichier de script à
exécuter à l’ouverture de la session.
Sous Windows 2000, il est également possible de configurer les stratégies de groupe afin
d’activer l’exécution d’un script au démarrage d’une session.
1. Démarrez une console MMC vierge. Pour ce faire, tapez MMC à l’invite de commande ou
dans le menu Démarrer → Exécuter. Ajoutez le composant enfichable Stratégie de
groupe.
2. Sélectionnez Ouverture de session ou Déconnexion sous Configuration utilisateur →
Paramètres Windows → Scripts (ouverture/fermeture de session)
3. Ensuite, ajoutez le chemin du fichier de script dont l’exécution doit s’effectuer
automatiquement.
DescoDev
6. Environnement d’exécution des Scripts
136
Sécuriser l’exécution des scripts
Le Windows Script Host a été conçu à la base en tant qu’outil d’administration des systèmes.
Cependant, on devinera rapidement que les fonctionnalités d’accès à la base de registre et aux
fichiers prévus par Windows Script Host peuvent en faire un outil de destruction des systèmes,
c’est-à-dire le transformer en virus. Puisqu’un script peut contenir du code malicieux, il peut
s’avérer vital à un administrateur réseau d’encadrer l’exécution des scripts au sein d’un
environnement multi-utilisateurs.
La technique la plus simple
demeure l’installation d’un
antivirus sur les postes
concernés. Par exemple, Norton
Antivirus peut bloquer l’exécution
de certaines instructions de
Windows Script Host jugées à
risque. Ainsi, l’exécution d’une
instruction WScript.Run
provoque l’intervention de Norton
Antivirus comme le démontre
l’illustration ci-contre.
Norton Antivirus offre ensuite la
possibilité à l’utilisateur d’arrêter le
script, d’exécuter l’instruction en
cours, d’exécuter l’ensemble du
script ou de toujours permettre
l’exécution d’une telle instruction.
Désactivation de l’exécution automatique des scripts
Par défaut, Windows associe les fichiers de script *.vbs mais également *.vbe, *.js, *.jse et *.wsf
aux hôtes CScript.exe et WScript.exe ce qui leur permet d’être automatiquement exécutés
lorsqu’un fichier de script est activé. Bien que ce comportement semble correct, il peut s’avérer
néfaste au sein d’un environnement multi-utilisateurs puisqu’un script pourrait contenir du code
malicieux. Ainsi, ce type de virus pourrait automatiquement être exécuté lorsqu’activé par
l’utilisateur ou par un logiciel de messagerie électronique. Il peut donc s’avérer important de
protéger les systèmes de l’exécution automatique de scripts malintentionnés.
Une technique de prévention classique demeurait de renommer les applications CScript.exe
et WScript.exe par quelque chose comme _CScript.exe et _WScript.exe afin de
corrompre l’association effectuée par Windows entre les fichiers script et les applications
correspondantes. L’exécution des scripts pouvait alors s’effectuer explicitement comme suit :
_CScript.exe c:\chemin\monScript.vbs
Sous les systèmes d’exploitation Windows 2000 et plus, cette technique est déconseillée puisque
les applications CScript.exe et WScript.exe sont stockées dans le cache DLL de Windows
et sont automatiquement régénérés lors du redémarrage de Windows.
L’association entre les fichiers de scripts et les applications peut également être interrompue à
l’aide d’une simple modification de la base de registre. En effet, l’association est inscrite dans
DescoDev
6. Environnement d’exécution des Scripts
137
la clé HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command comme le démontre
l’illustration suivante indiquant que l’application WScript.exe est utilisée pour ouvrir les fichiers
VBSFile :
Le fait d’exécuter un fichier *.reg comme le suivant afin de modifier la base de registre pourrait
avoir l’effet d’ouvrir automatiquement Notepad.exe lorsque le fichier de script est activé.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command]
@="Notepad.exe \"%1\" %*"
[HKEY_CLASSES_ROOT\VBSFile\Shell\Open3]
@="E&xécuter"
[HKEY_CLASSES_ROOT\VBSFile\Shell\Open3\Command]
@="C:\\WINNT\\System32\\WScript.exe \"%1\" %*"
CH06\Scripts Sécurisés.reg
La commande Open est désormais associée
avec Notepad.exe et une troisième action
(Open3) a été définie pour lancer
WScript.exe. Ainsi, l’exécution des fichiers
de scripts devrait se faire explicitement à l’aide
du menu contextuel comme le démontre
l’illustration ci-contre.
Il reste à répéter l’opération sur les fichiers
WSFFile, VBEFiles, JSFile et JSEFile.
DescoDev
6. Environnement d’exécution des Scripts
138
Désactivation de l’autorisation d’exécuter des scripts
Un administrateur réseau peut désirer s’accaparer le privilège d’exécuter des scripts sur les
différents postes constituant son réseau afin de s’assurer que l’action des utilisateurs ne
provoquera pas de résultats indésirables sur leur poste respectif.
Il est possible dans un environnement Windows NT4, 2000 et XP de définir les permissions
d’exécuter un fichier à des utilisateurs et des groupes spécifiques. Ainsi, il suffit de limiter la
permission d’exécuter les fichiers CScript.exe et WScript.exe à des groupes restreints pour
éviter qu’un utilisateur non-autorisé n’active par inadvertance un script quelconque.
1. Connectez-vous en rôle
d’administrateur sur le poste local
et repérez les fichiers
CScript.exe et WScript.exe.
Vous trouverez ceux-ci dans le
répertoire système
(\winnt\system32 sous Windows
NT4 et Windows 2000;
\winnt\system sous Windows XP).
2. À l’aide du bouton droit de la souris
sur le fichier, activez le menu
contextuel et sélectionnez le sousmenu Propriétés.
3. Sélectionnez l’onglet Sécurité
puis ajoutez et supprimez les
groupes et utilisateurs possédant
un accès au fichier.
Notez que cette technique empêche les utilisateurs exclus des permissions d’exécuter tout script
puisqu’il ne possède d’accès à l’hôte de script nécessaire à l’exécution des scripts sous
Windows.
DescoDev
6. Environnement d’exécution des Scripts
139
Une autre solution demeure d’utiliser les stratégies de groupe pour limiter l’accès aux fichiers
CScript.exe et WScript.exe.
4. Démarrez une console MMC vierge. Pour ce faire, tapez MMC à l’invite de commande ou
dans le menu Démarrer → Exécuter. Ajoutez le composant enfichable Stratégie de
groupe.
5. Sélectionnez N’exécutez pas les applications Windows spécifiées sous Configuration
utilisateur → Modèles d’administration → Système
6. Ensuite, activez la stratégie et ajoutez le nom des deux applications CScript.exe et
WScript.exe à la liste d’applications dont l’exécution n’est pas permise.
Il est également possible de désactiver l’autorisation d’un ou de tous les utilisateurs d’un poste
d’exécuter des scripts à l’aide de la base de registre. Cette technique se montre particulièrement
utile si vous utilisez des fichiers *.reg afin de définir les clés de la base de registre de vos postes.
Pour désactiver l’autorisation d’un utilisateur d’un poste d’exécuter des scripts, créez le fichier
*.reg et inscrivez-y la clé et la donnée suivante :
[HKEY_CURRENT_USER\Software\Microsoft\Windows Script Host\Settings]
"Enabled"=dword:00000000
Pour désactiver l’autorisation de tous les utilisateurs d’un poste d’exécuter des scripts, inscrivez-y
plutôt la clé et la donnée suivante :
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Script Host\Settings]
"Enabled"=dword:00000000
DescoDev
Windows Script Host - Programmation à l’aide de VBScript
140
Bibliographie
“Microsoft Visual Basic Scripting Edition and Microsoft
Windows Script Host Essentials”, Microsoft Official Curriculum Course 2433A (2001)
"Documentation Windows Script Host 5.6", Microsoft MSDN (2002)
BORN, G. “Windows Script Host 2.0 Developer’s Guide”, Microsoft Press (2000)
FRANTZ, G. "Visual Basic 6 - Le platinum", Sybex (1998)
“Platform SDK : Windows Firewall”, Microsoft MSDN (2004)
http://msdn.microsoft.com/library/en-us/ics/ics/windows_firewall_reference.asp
Tout produit et nom de compagnie mentionné peut être une marque déposée par leur propriétaires et peut être régi par
les législations canadienne et internationale en matière de propriété intellectuelle.