techniques avancees de script - resinfo.free.frresinfo.free.fr/btsiris/cours/programmation/vbs/cours...

29
5. Techniques avancées de Script 97 DescoDev 5 Techniques avancées de Script

Upload: vuongthuan

Post on 03-Sep-2018

244 views

Category:

Documents


2 download

TRANSCRIPT

5. Techniques avancées de Script 97

DescoDev

5

Techniques avancées de Script

5. Techniques avancées de Script 98

DescoDev

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 précédent chapitre. 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 ? Certainement. La difficulté réside dans le fait qu’il se doit de connaître les modèles d’objets propres à Internet Explorer et aux bases de données concernées 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 ont 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.

5. Techniques avancées de Script 99

DescoDev

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.

5. Techniques avancées de Script 100

DescoDev

<BODY> <FORM Name="frm"> <TABLE> <TR> <TD ALIGN="Right">Utilisateur:</TD> <TD WIDTH="30%"><INPUT Name="txtUtilisateur" Disabled></TD> <TD ALIGN="Right">Poste:</TD> <TD WIDTH="30%"><INPUT Name="txtPoste" Disabled></TD> </TR> <TR> <TD ALIGN="Right">Date:</TD> <TD><INPUT Name="txtDate" Disabled></TD> <TD ALIGN="Right">Heure:</TD> <TD><INPUT Name="txtHeure" Disabled></TD> </TR> <TR> <TD ALIGN="Right" VAlign="Top">Problème:</TD> <TD ColSpan="3"> <TEXTAREA Name="txtProbleme" ROWS="5"></TEXTAREA> </TD> </TR> <TR> <TD ALIGN="Right">Gravité:</TD> <TD ColSpan="3"><SELECT> <OPTION Value="1">Faible</OPTION> <OPTION Value="2" SELECTED>Moyenne</OPTION> <OPTION Value="3">Haute</OPTION> <OPTION Value="4">Très haute</OPTION> </SELECT> </TD> </TR> <TR> <TD ALIGN="Right" ColSpan="2"><P>&nbsp;</P> <A HREF="">Envoyer</A> <P>&nbsp;</P> </TD> <TD ColSpan="2"><P>&nbsp;</P> <A HREF="">Annuler</A> <P>&nbsp;</P> </TD> </TR> </TABLE> </FORM> </BODY>

CH05\Demande Service\Demande.htm

5. Techniques avancées de Script 101

DescoDev

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 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 & "fichier.htm" oIE.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 *******************'

oIE.Navigate Chemin & "fichier.htm" Set wshNetwork = CreateObject("WScript.Network") oIE.Document.frm.txtPoste.value = wshNetwork.ComputerName oIE.Document.frm.txtUtilisateur.value = wshNetwork.UserName oIE.Document.frm.txtDate.value = Date() oIE.Document.frm.txtHeure.value = Time() oIE.Visible = True

5. Techniques avancées de Script 102

DescoDev

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 oIE = WScript.CreateObject("InternetExplorer.Application") oIE.Width = 550 oIE.Height = 550 oIE.Left = 100 oIE.Top = 100 oIE.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.

Resizable 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.

Set oIE = WScript.CreateObject("InternetExplorer.Application") oIE.StatusBar = False oIE.MenuBar = False oIE.ToolBar = False oIE.Visible = True

5. Techniques avancées de Script 103

DescoDev

Accéder aux variables définies au sein de la page Html Les pages Html peuvent incorporer du script VBScript tel que celui que nous avons utilisé avec Windows Script Host. La différence réside dans le fait que l’hôte est Internet Explorer au lieu d’être WScript.exe et que, conséquemment, les modèles d’objets disponibles ne sont pas les mêmes. Un script est inséré au sein d’une page Html à l’aide de la balise <Script> comme suit: <BODY> <SCRIPT Language="VBScript"> </SCRIPT> </BODY> Ainsi, le code inséré entre les deux balises <Script> sera interprété comme un code VBScript inséré dans un fichier *.vbs. Le but de notre opération est d’y définir une variable qui spécifiera à notre script si l’utilisateur a appuyé sur le bouton ‘Envoyer’ ou non. <BODY> <SCRIPT Language="VBScript"> Public Pret Pret = 0 </SCRIPT> </BODY> ... <TR> <TD ALIGN="Right" ColSpan="2"><P>&nbsp;</P> <A HREF="" onClick="Pret = 1">Envoyer</A> <P>&nbsp;</P> </TD> <TD ColSpan="2"><P>&nbsp;</P> <A HREF="" onClick="Pret = 2">Annuler</A> <P>&nbsp;</P> </TD> </TR> Finalement, nous spécifions la valeur que doit prendre la variable Pret sur le click des différents liens 'Envoyer' et 'Annuler'. Ainsi, notre script attendra que la variable Pret soit différente de zéro et alors il saura que l’utilisateur désire envoyer la demande de service. Notre script WSH devra donc inclure la boucle suivante lui permettant d’attendre le click d’un bouton du formulaire Html avant de continuer son exécution. Souvenez-vous que ces prouesses sont nécessaires puisque les deux applications s’exécutent de manière asynchrone : Do Loop While oIE.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.

5. Techniques avancées de Script 104

DescoDev

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 oIE, wshNetwork, Texte, Chemin '***** Procède à la création de l’objet Internet Explorer *******' Set oIE = WScript.CreateObject("InternetExplorer.Application") Set wshNetwork = WScript.CreateObject("WScript.Network") '******* 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 & "demande service/demande.htm" oIE.Width = 550 oIE.Height = 550 oIE.ToolBar = False oIE.MenuBar = False oIE.StatusBar = False '******************* Rempli les informations connues **********' oIE.Document.frm.txtPoste.value = wshNetwork.ComputerName oIE.Document.frm.txtUtilisateur.value = wshNetwork.UserName oIE.Document.frm.txtDate.value = Date() oIE.Document.frm.txtHeure.value = Time() oIE.Visible = True '********* Attend que l'utilisateur appuie sur un bouton *********' Do WScript.Sleep 100 Loop Until oIE.Document.Script.Pret = 0 '*************** Utilisateur a appuyé sur 'Envoyer' **************' If oIE.Document.Script.Pret = 1 Then Texte = oIE.Document.frm.txtUtilisateur.value & " a un problème " _ & " sur le poste " & oIE.Document.frm.txtPoste.value & vbCrLf _ & "Problème: " & oIE.Document.frm.txtProbleme.value & vbCrlf _ & "Gravité: " & oIE.Document.frm.cmbGrave.value CreateObject("WScript.Shell").Run "net send AdminDomaine " & Texte End If oIE.Quit

CH05\Demande Service.vbs

5. Techniques avancées de Script 105

DescoDev

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 Fso, Drv, K, Filename, oIE, stResultat, AfficherWeb Set FSO = 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 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 '******************* 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 oIE.Quit Set oIE = Nothing End If

Le code se poursuit sur la page suivante

5. Techniques avancées de Script 106

DescoDev

Function FindFile( ByVal Filename, ByVal Fld) Dim Fl, 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 FSO.FileExists(stFichier) Then stResultat = stResultat & " * " & stFichier & vbCrLf Exit Function End If '********* Récursivité sur l’ensemble des sous-dossiers **********' For Each Fl 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 = WScript.ScriptFullName Chemin = Left(Chemin, InStrRev(Chemin, "\")) If FSO.FileExists(Chemin & "recherche\recherche.htm") Then Set oIE = WScript.CreateObject("InternetExplorer.Application") '*********** Attend que Internet Explorer s’affiche **********' Do While oIE.Busy WScript.Sleep 200 Loop

oIE.Navigate Chemin & "recherche\recherche.htm" oIE.Width = 550 oIE.Height = 200 oIE.MenuBar = False oIE.StatusBar = False oIE.ToolBar = False oIE.Document.frm.fichier.value = Filename oIE.Visible = True AfficherWeb = True End If End Sub

CH05\Recherche.vbs

5. Techniques avancées de Script 107

DescoDev

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" & """"

5. Techniques avancées de Script 108

DescoDev

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 Description Exemple

Appwiz.cpl - 0 à 3 Affiche la boîte de dialogue Ajout/Suppression de programmes.

Appwiz.cpl,,0

Desk.cpl - 0 à 3 Affiche la boîte de dialogue Affichage. Desk.cpl,,1

Intl.cpl - 0 à 4 Affiche la boîte de dialogue Paramètres régionaux. Intl.cpl,,2

Main.cpl @0 à @5 0 à x

Affiche les boîtes de dialogue Souris, Clavier et PCMCIA où le nom représente la boîte de dialogue à afficher.

Main.cpl, @0,1 Main.cpl, mouse,1

MmSys.cpl @0 à @1 0 à x Affiche la boîte de dialogue Sons et multimédia. Mmsys.cpl, @0,1

SysDm.cpl - 0 à 3 Affiche la boîte de dialogue Système. Sysdm.cpl,,0

TimeDate.cpl - 0 à 1 Affiche la boîte de dialogue Date/Heure. 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"

5. Techniques avancées de Script 109

DescoDev

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 lui-mê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.

5. Techniques avancées de Script 110

DescoDev

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. 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")

5. Techniques avancées de Script 111

DescoDev

L’objet NewMail possède les propriétés et méthodes suivantes : Propriété Description

Bcc

Spécifie la ou les adresse(s) destination en tant que copie conforme invisible du message. Spécifiez-y des adresses valides ([email protected]). Différentes destinations peuvent être précisées en les séparant par des points-virgules.

Body Spécifie le message même du courrier. Insérez-y des balises Html seulement si BodyFormat = CdoBodyFormatHTML.

BodyFormat

Spécifie le format du message du courrier où CdoBodyFormatHtml = 0 et CdoBodyFormatText = 1. Si le format du message utilise Html, les 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.

Cc

Spécifie la ou les adresse(s) destination en tant que copie conforme du message. Spécifiez-y des adresses valides ([email protected]). Différentes destinations peuvent être précisées en les séparant par des points-virgules.

ContentBase URL complet de base du message et de ses attachements. Cet URL est 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.

From Spécifie l’adresse de provenance du message. Spécifiez-y une adresse de messagerie valide ([email protected]).

Importance Spécifie l’importance du courrier où Low=0, Normal=1 et High=2.

MailFormat Spécifie le format du courrier où CdoMailFormatMime = 0 et CdoMailFormatText = 1.

Subject Spécifie l’objet, le sujet, le titre du message.

To 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.

Value 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. 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.

5. Techniques avancées de Script 112

DescoDev

'****************************************************************' '* 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

5. Techniques avancées de Script 113

DescoDev

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 Description

Registry 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.

RegKey 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.

RegValue 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_.

RegKeyFromHKey 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.

RemoteRegistry Obtient un objet Registry sur le registre du poste distant spécifié.

5. Techniques avancées de Script 114

DescoDev

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.

HKey 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.

Name Nom de la clé de registre référencée.

Parent 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.

SubKeys Obtient une collection des sous-clés de la clé actuellement référencée.

Value Obtient ou détermine les données de la valeur par défaut sous forme de chaîne de caractères.

Values Obtient une collection d’objets RegValue contenues par la clé référencée. Méthode Description

ParseKeyName 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

CH05\Liste RegValues.vbs

5. Techniques avancées de Script 115

DescoDev

Voici la liste des membres de l’objet RegValue : Propriété Description

Name 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 Type de donnée de la valeur où rvNone = 0, rvString = 1, rvExpandString= 2, rvBinary = 3, rvLong = 4 et rvMultiString = 7.

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

CH05\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.

5. Techniques avancées de Script 116

DescoDev

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.

5. Techniques avancées de Script 117

DescoDev

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 Obtient la description du clavier relié au poste. Win32_Network Adapter Obtient la description de(s) carte(s) réseau reliée(s) au poste.

Win32_Operating System Obtient la description de(s) moniteur(s) relié(s) au poste.

Win32_Physical Memory Obtient la description de la mémoire vive reliée au poste.

Win32_PointingDevice Obtient la description de(s) appareils de pointage relié(s) au poste (souris, stylet, etc).

Win32_Printer 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_VideoController Obtient la description de(s) carte(s) vidéo reliée(s) au poste.

5. Techniques avancées de Script 118

DescoDev

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("====================================") '************************** Détection ******************************' DetectCPU Machine Fichier.WriteLine(" ") DetectMotherboard Machine 'Les fonctions Detect??? plus bas Fichier.WriteLine(" ") 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

5. Techniques avancées de Script 119

DescoDev

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

5. Techniques avancées de Script 120

DescoDev

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

5. Techniques avancées de Script 121

DescoDev

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

5. Techniques avancées de Script 122

DescoDev

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

5. Techniques avancées de Script 123

DescoDev

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

5. Techniques avancées de Script 124

DescoDev

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

5. Techniques avancées de Script 125

DescoDev

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 DeviceID, IsLocked, Layout, NumberOfFunctionKeys, etc. Win32_Network Adapter AdapterType, Description, Name, ProductName

Win32_Physical Memory Capacity, DeviceLocator, MACAddress, MemoryType

Win32_PointingDevice DeviceInterface, Name, NumberOfButtons, PointingType, etc.

Win32_Printer Capabilities, DefaultPriority, Description, DriverName, etc.

Win32_Processor Architecture, Name, CurrentClockSpeed, L2CacheSize, etc.

Win32_SoundDevice DMABufferSize, MPU401Address, ProductName, PNPDeviceID, etc.

Win32_VideoController AcceleratorCapabilities, Caption, PNPDeviceID, VideoArchitecture, etc