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> </P> <A HREF="">Envoyer</A> <P> </P> </TD> <TD ColSpan="2"><P> </P> <A HREF="">Annuler</A> <P> </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> </P> <A HREF="" onClick="Pret = 1">Envoyer</A> <P> </P> </TD> <TD ColSpan="2"><P> </P> <A HREF="" onClick="Pret = 2">Annuler</A> <P> </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.