Hé, vous le scripteur !La poussée d'adrénaline

Les scripteurs Microsoft

Il ne fait aucun doute qu'écrire pour TechNet Magazine est le plus prestigieux et le plus gratifiant travail qui soit. (Bien sûr, il serait encore plus gratifiant si nous étions réellement payés, mais c'est une autre histoire). Mais quel est exactement le prestige de ce travail ? Disons cela comme ça : à ce moment même, partout dans le monde, les enfants qui sont mis au lit regardent leur mère et disent « Maman, lorsque je serai grand, je veux participer chaque mois à la rubrique des scripteurs de TechNet Magazine ».

Remarque Bien sûr, partout dans le monde, certaines personnes pensent que cette rubrique est déjà écrite par des enfants. Mais ça, c'est également une autre histoire.

On sait bien que les Scripteurs adorent être l'objet des adulations dispensées à tous ceux qui écrivent pour TechNet Magazine. Nous avons même appris à tolérer les demandeurs d'autographe et les paparazzi. Mais la vérité c'est que nous ne faisons pas ce travail pour l'honneur et la gloire. Nous faisons ce travail pour la poussée d'adrénaline qui accompagne l'écriture de scripts d'administration de système.

Il est vrai que vous ne voyez pas souvent les expressions « poussée d'adrénaline » et « script d'administration de système » dans la même phrase. (À moins, bien sûr, que la poussée d'adrénaline ne soit précédée par son manque total et complet).

Monsieur Tout-Le-Monde considère les scripts d'administration de système comme étant extrêmement utiles mais probablement pas très passionnants. En fait, il trouve probablement les scripts un peu monotones. Et en voici la raison : ces personnes n'ont pas essayé d'écrire des scripts de données de configuration du démarrage dans Windows Vista® ou Windows Server® 2008.

Et oui, votre rythme cardiaque a légèrement augmenté, pas vrai ? Comme la plupart d'entre vous le savez probablement, dans Windows Vista et Windows Server 2008, l'ancien fichier boot.ini a été remplacé par une nouvelle banque de données de configuration de démarrage qui assure une meilleure flexibilité (et capacité) lorsqu'il s'agit de gérer le processus de démarrage.

C'est plutôt sympa. Mais voila encore mieux : grâce à un nouveau fournisseur Windows® Management Instrumentation (WMI), l'accès à la banque de données de configuration de démarrage (BCD) est désormais facile (et sa gestion totale) grâce à l'utilisation de scripts.

Vous venez de ressentir une sensation étrange le long de votre colonne vertébrale, ne vous inquiétez pas : c'était une poussée d'adrénaline. Après avoir commencé à travailler avec les scripts BCD, vous vous y habituerez.

Avant de poursuivre, nous devrions préciser que nous ne pouvons pas couvrir tout ce qui peut être fait en utilisant le fournisseur BCD, du moins pas dans cet article. (Nous avons envoyé un message électronique aux éditeurs du magazine pour leur parler de l'éventualité de consacrer un numéro double spécial exclusivement à l'écriture de scripts de données de configuration de démarrage, mais nous n'avons pas encore eu de leurs nouvelles).

Si vous voulez plus d'informations, consultez la documentation du fournisseur WMI BCD sur go.microsoft.com/fwlink/?LinkId=116953. En attendant, nous allons vous montrer un exemple de code conçu pour les ordinateurs à démarrage multiple, c'est-à-dire les ordinateurs avec plusieurs systèmes d'exploitation.

Au fait, ces scripts fonctionnent seulement sur Windows Vista et Windows Server 2008. C'est parce que, comme nous venons de le dire, il s'agit des deux seuls systèmes d'exploitation qui prennent actuellement en charge BCD.

Commençons par jeter un coup d'œil à un script qui nous dit quel système d'exploitation est actuellement utilisé sur un ordinateur. D'accord, ce n'est pas l'utilisation la plus passionnante pour le fournisseur BCD. Après tout, nous pouvons déjà utiliser la classe WMI Win32_OperatingSystem pour déterminer quel système d'exploitation est actuellement utilisé sur un ordinateur. Toutefois, il s'agit d'un script raisonnablement simple (pour autant que les scripts BCD soient concernés) et il s'agit d'un bon moyen pour illustrer les techniques fondamentales requises pour travailler avec BCD (techniques qui sont, pour le moindre, un peu... inhabituelles).

Par ailleurs, notre rubrique ne doit pas engendrer trop d'agitation : TechNet Magazine nous a déjà dit que nous serons responsables de tout dommage causé par des fans surexcités et trop zélés de Hé, vous le Scripteur ! Après l'hystérie collective qui a suivi, dans le monde entier, la publication de notre article sur les expressions régulières, et bien, nous ne pouvons plus nous permettre de refaire quoi que ce soit d'aussi excitant.

Remarque Vous vous souvenez de toutes ces vidéos des Beatles attaqués par leurs fans et de toutes ces images de filles s'évanouissant et pleurant dès qu'elles voyaient John, Paul, George et Ringo ? C'est un peu comme ça que les choses se passent pour nous chaque fois que nous publions un nouvel article.

Bon d'accord, j'exagère peut-être un peu. Mais il ne fait aucun doute que de nombreuses personnes, des hommes aussi bien que des femmes, sanglotent après avoir lu l'un de nos articles.

Jetez un coup d'œil au script de la figure 1, qui utilise le fournisseur BCD pour déterminer quel système d'exploitation est actuellement utilisé sur un ordinateur. Avant d'essayer d'exécuter ce script, sachez que vous devez être identifié comme administrateur, sinon le script échouera.

Figure 1 Connaître le système d'exploitation actuel

Const BcdLibraryString_Description = &h12000004
Const Current = "{fa926493-6f1c-4193-a414-58f0b2456d1e}"

strComputer = "."

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
 strComputer & "\root\wmi:BcdStore")

objStoreClass.OpenStore "", objStore
objStore.OpenObject Current, objDefault

objDefault.GetElement BcdLibraryString_Description, objElement
Wscript.Echo "Current operating system: " & objElement.String

Et non, cela ne signifie pas simplement que vous devez être connecté à un compte disposant de privilèges d'administrateur. Cela signifie que vous devez ouvrir une fenêtre Invite de commande en cliquant avec le bouton droit sur Invite de commande dans le menu Démarrer et sélectionner Exécuter comme administrateur. Vous pouvez ensuite exécuter ce script à partir de l'invite de commande.

Comment ce script fonctionne-t-il ? Nous avions peur que vous nous le demandiez. Mais pas de problème ! Nous allons essayer de l'expliquer le mieux possible (ce qui, en dehors de toute autre chose, devrait limiter l'excitation autant que possible, au moins pour quelques temps).

Commençons par définir deux constantes : BcdLibraryString_Description et Current. BcdLibraryString_Description se réfère à l'objet que nous voulons récupérer. Dans ce cas, cet objet contient la Description (nom) du système d'exploitation actuel.

Il s'agit, en fait, de l'un des caprices touchants du fournisseur BCD. Généralement, vous ne récupérez pas simplement la valeur d'une propriété. Plutôt, vous utilisez l'une de ces valeurs constantes (et la méthode GetElement) pour récupérer un autre objet, puis renvoyez la valeur d'une propriété appartenant à cet objet. C'est certainement un peu bizarre, mais vous savez ce qu'on dit : le trajet, c'est la moitié du plaisir.

Remarque Vous vous demandez où ils veulent en venir, pas vrai ?

Quant à la constante Current, il s'agit simplement d'un GUID qui représente le système d'exploitation actuellement utilisé. La valeur

 {fa926493-6f1c-4193-a414-58f0b-2456d1e} 

est considérée comme un GUID « bien connu » (ce qui, à lui seul, prouve que les employés de Microsoft ont bien le sens de l'humour).

Bien qu'il s'agisse d'un GUID bien connu, nous avons poursuivi et inclus la valeur de toute façon, juste au cas où l'un de nos lecteurs aurait du mal à se rappeler laquelle des deux valeurs suivantes est correcte :

{fa926493-6f1c-4193-a414-58f0b2456d1e} 
{fa926493-6f1c-4193-a414-58f0b2456d1f}

Remarque Au cas où vous vous poseriez la question, GUID peut être prononcé « gwid » ou « gou-id ». Nous pourrions rajouter, par exemple, que le précédent GUID doit être un V1 GUID, en voyant comment le troisième groupe de chiffres commence avec un 4. Mais, nous avons promis de limiter l'excitation autant que possible. Et nous tenons nos promesses.

Comme vous l'aurez peut-être deviné, vous devrez utiliser des constantes, des valeurs hexadécimales et des GUID pratiquement partout en travaillant avec le fournisseur BCD. Nous ne pouvons pas couvrir tous ces sujets dans la rubrique de ce mois, mais vous pouvez consulter la page BCD dont nous avons déjà parlé sur MSDN® (go.microsoft.com/fwlink/?LinkId=116953) pour plus d'informations. Si vous pouvez supporter cette excitation, c'est parfait.

Après avoir défini nos deux constantes, nous nous connectons au service WMI sur l'ordinateur local. Pouvez-vous utiliser ce script pour récupérer les données de configuration de démarrage pour une machine distante ? Bien sûr que c'est possible.

Pour être honnête, dans le cas contraire, tout ce truc avec BCD n'aurait que peu d'intérêt. Pour récupérer les données de configuration de démarrage d'une machine distante (je le répète, l'ordinateur distant doit exécuter Windows Vista ou Windows Server 2008), vous attribuez simplement le nom de cette machine à la variable strComputer :

strComputer = "atl-fs-001"

Nous devons également indiquer deux éléments clés dans notre chaîne de connexion WMI. Pour commencer, vous aurez peut-être remarqué que nous avons inclus les privilèges de Sauvegarde et Restauration dans notre chaîne de connexion. C'est ce que fait la construction {(Backup,Restore)}. Est-ce important ? Et bien, si vous voulez que votre script fonctionne, c'est très important : autrement dit, si vous n'incluez pas explicitement ces deux privilèges, le script échouera.

Ensuite, vous noterez que nous ne nous connectons pas à l'espace de noms root\cimv2, l'espace de noms le plus couramment utilisé dans les scripts d'administration de système. À la place, nous nous connectons à l'espace de noms root\WMI et nous nous connectons directement à la classe BCDStore. C'est ce que fait ce bout de code :

"\root\wmi:BcdStore" 

Et non, ce n'était pas la partie passionnante. Elle est encore à venir.

Bien qu'il puisse y avoir une ou deux exceptions, globalement tout script BCD que vous écrivez commencera par les mêmes trois étapes : définition des constantes, connexion au service WMI et ouverture du magasin BCD. Nous avons déjà réalisé les étapes 1 et 2. La ligne de code suivante correspond à l'étape 3 :

objStoreClass.OpenStore "", objStore

Comme nous l'avons dit, nous ouvrons le magasin BCD, l'entité du système d'exploitation qui enregistre toutes les informations de votre configuration de démarrage. Pour ouvrir le magasin, nous appelons simplement la méthode OpenStore, en lui transmettant deux paramètres :

  • Une chaîne vide (""). Cela dit au script que nous voulons ouvrir le magasin par défaut.
  • objStore. C'est un paramètre « out » que nous transmettons au script. Nous donnons à la méthode le nom d'une variable et, dans un mouvement de gratitude, la méthode renvoie un objet (dans ce cas, un objet représentant le magasin BCD) qui utilise ce nom de variable comme référence objet.

Dès que le magasin est ouvert, nous pouvons utiliser la méthode OpenObject pour récupérer un autre objet (enregistré dans le paramètre out objDefault) :

objStore.OpenObject Current, objDefault

Et quel est ce nouvel objet ? C'est exact : c'est le système d'exploitation actuellement utilisé. Nous le savons parce que nous avons transmis à OpenObject la constante Current, le GUID bien connu qui représente le système d'exploitation actuel.

Bien, donc maintenant nous savons quel système d'exploitation est actuellement utilisé sur l'ordinateur, pas vrai ? Et bien, presque. Pour obtenir cette information, nous devons encore utiliser GetElement pour récupérer un objet représentant la Description de ce système d'exploitation :

objDefault.GetElement _
  BcdLibraryString_Description, objElement

Maintenant, promettez-vous que vous garderez votre sang froid et ne succomberez pas à une hystérie collective ? Bien. Dans ce cas, nous pouvons vous dire que nous allons renvoyer la valeur de la propriété de Chaîne et, enfin, déterminer le système d'exploitation actuellement utilisé sur l'ordinateur :

Wscript.Echo "Current operating system: " _
  & objElement.String

Veuillez garder votre calme. Rappelez-vous votre promesse : pas d'hystérie collective. Oui, nous savons que c'est difficile. Faites de votre mieux. Respirez profondément. Ca marche toujours pour nous lorsque nous écrivons des scripts BCD.

Comme nous l'avons dit, la route est longue pour arriver simplement à déterminer quel système d'exploitation est utilisé sur un ordinateur. Il existe des façons plus faciles de le faire. Toutefois, le bon côté de la chose est que vous comprenez maintenant comment fonctionne un script BCD, ce qui signifie que vous pouvez faire certaines choses que les auteurs de script n'ont jamais pu. (Restez calme, restez calme). Par exemple, sur un ordinateur à démarrage multiple, un système d'exploitation est toujours étiqueté par « défaut ». Si un ordinateur redémarre, en l'absence d'un autre ordre, l'ordinateur charge automatiquement le système d'exploitation par défaut. Avant Windows Vista (et le fournisseur BCD), il n'y avait pas de façon pour un scripteur de déterminer le système d'exploitation par défaut d'un ordinateur. Maintenant, c'est aussi facile qu'exécuter un script comme celui de la figure 2.

Figure 2 Détermination du système d'exploitation par défaut

Const BcdLibraryString_Description = &h12000004
Const BootMgrId = "{9dea862c-5cdd-4e70-acc1-f32b344d4795}"
Const DefaultType = &h23000003

strComputer = "." 

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
    strComputer & "\root\wmi:BcdStore")
objStoreClass.OpenStore "", objStore

objStore.OpenObject BootMgrId, objBootMgr 

objBootMgr.GetElement DefaultType, objDefaultOSIdentifier
objStore.OpenObject objDefaultOSIdentifier.Id, objDefault

objDefault.GetElement BcdLibraryString_Description, objElement 
WScript.Echo "Default operating system: " & objElement.String

Vous avez raison : cela mérite une petite hystérie collective, pas vrai ? D'accord, mais une toute petite ! Nous n'expliquerons pas ce script en détail. Si vous n'avez pas survolé les 10 ou 12 précédents paragraphes, vous devriez pouvoir suivre la logique. Vous remarquerez toutefois que pour arriver au système d'exploitation par défaut, nous devons passer par une étape intermédiaire : nous devons utiliser la méthode OpenObject pour ouvrir une instance de l'objet Gestionnaire de démarrage. Après avoir ouvert le Gestionnaire de démarrage, nous pouvons utiliser la constante DefaultType pour récupérer un objet représentant le système d'exploitation par défaut.

Maintenant, je le reconnais, c'est plutôt excitant : nous pouvons déterminer le système d'exploitation actuel et nous pouvons déterminer le système d'exploitation par défaut. Mais savez-vous ce qui serait vraiment super ? Ce serait de récupérer une liste de tous les systèmes d'exploitation installés sur un ordinateur. Ce serait vraiment excitant ! Attachez vos ceintures de sécurité et regardez la figure 3.

Que faisons-nous ici ? Et bien, pour commencer, nous définissons deux nouvelles constantes : WindowsImages, qui nous permet de récupérer des instances de tous les systèmes d'exploitation qui prennent en charge BCD (c'est-à-dire, Windows Vista et Windows Server 2008) ; et LegacyImages, qui nous permet de récupérer des instances de tous les systèmes d'exploitation « hérités » sur l'ordinateur. Après nous nous connectons au magasin BCD, nous utilisons la méthode EnumerateObjects pour récupérer toutes les instances des systèmes d'exploitation compatibles BCD installés sur l'ordinateur :

objStore.EnumerateObjects _
  WindowsImages, colObjects 

Figure 3 Recherche de tous les systèmes d'exploitation sur un ordinateur

Const BcdLibraryString_Description = &h12000004
Const WindowsImages = &h10200003
Const LegacyImages = &h10300006

strComputer = "."

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
 strComputer & "\root\wmi:BcdStore")

objStoreClass.OpenStore "", objStore 

objStore.EnumerateObjects WindowsImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement BcdLibraryString_Description, objElement 
 Wscript.Echo objElement.String
Next
Wscript.Echo

objStore.EnumerateObjects LegacyImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement BcdLibraryString_Description, objElement 
 Wscript.Echo objElement.String
Next

Après qu'EnumerateObjects a terminé, nous définissons une boucle For Each qui parcourra tous les systèmes d'exploitation dans cette collection. Dans cette boucle, nous utilisons ces deux lignes de code pour récupérer et afficher la Description du système d'exploitation :

objObject.GetElement _
  BcdLibraryString_Description, objElement 
Wscript.Echo objElement.String

Puis nous répétons le processus avec tout système d'exploitation hérité installé sur la machine :

objStore.EnumerateObjects _
  LegacyImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement _
  BcdLibraryString_Description, objElement 
 Wscript.Echo objElement.String
Next

Remarque Nous comprenons les frissons que vous ressentez, mais veuillez exécuter vos scripts BCD de façon responsable. Il y a probablement une limite au nombre de poussées d'adrénaline que le corps humain peut supporter. Les femmes qui sont enceintes ou peuvent tomber enceintes ou peuvent ne jamais tomber enceintes, ou qui ont été enceintes ou qui ne sont pas des femmes mais sont en fait des hommes, ne doivent pas exécuter les scripts BCD sans avoir consulté au préalable leur médecin.

Bon, d'accord, il n'est pas nécessaire de consulter son médecin au préalable. Mais il serait intéressant d'entendre ce qu'un médecin dirait si vous lui parliez des scripts BCD, n'est-ce pas ?

Essayons quelque chose de complètement fou. Voyons si nous pouvons modifier le système d'exploitation par défaut. Par exemple, supposons que nous ayons un ordinateur à double amorçage exécutant Windows Vista et Windows Server 2008. Et supposons que nous voulions définir Windows Vista comme système d'exploitation par défaut. Comment procéder ? Jetons un coup d'œil à la figure 4. Elle montre une façon de faire.

Figure 4 Modification du système d'exploitation par défaut

Const BootMgrId = "{9dea862c-5cdd-4e70-accl-f32b344d4795}"
Const BcdLibraryString_Description = &h12000004
Const DefaultType = &h23000003
Const WindowsImages = &h10200003

strComputer = "."

Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\" & _
 strComputer & "\root\wmi:BcdStore")

objStoreClass.OpenStore "", objStore 
objStore.EnumerateObjects WindowsImages, colObjects 

For Each objObject in colObjects
 objObject.GetElement BcdLibraryString_Description, objElement 
 If Instr(objElement.String, "Vista") Then
  objStore.OpenObject BootMgrId, objBootMgr 
  objBootMgr.SetObjectElement DefaultType, objObject.ID 
 End If
Next

Avec ce script, nous ouvrons de nouveau le magasin BCD, puis nous utilisons EnumerateObjects pour récupérer une collection de tous les systèmes d'exploitation gérant BCD installés sur l'ordinateur. De là, nous définissons une boucle For Each qui parcourra tous les éléments de cette collection, en utilisant la ligne de code suivante (et maintenant familière) pour récupérer la Description pour chaque système d'exploitation :

objObject.GetElement _
  BcdLibraryString_Description, objElement

Dès que nous avons la Description pour un système d'exploitation donné, nous utilisons la fonction InStr pour voir si le mot Vista apparaît quelque part dans cette valeur :

If Instr(objElement.String, "Vista") Then

Et vous avez raison, cela semble un peu bringuebalant. Le mieux serait d'utiliser le GUID pour Windows Vista et d'ouvrir directement ce système d'exploitation, sans devoir énumérer et parcourir tous les systèmes d'exploitation sur l'ordinateur.

Malheureusement, pour cela nous devrions connaître le GUID pour Windows Vista. Alors que de cette façon, nous ne devons rien savoir (toujours un plus pour les Scripteurs), nous n'avons qu'à chercher jusqu'à ce que nous trouvions le mot Vista dans le titre.

Remarque Que ce passe-t-il si vous avez de multiples instances de Windows Vista installées sur l'ordinateur ? Dans ce cas, vous devez chercher une chaîne comme Vista Ultimate ou Vista Enterprise.

Dès que nous trouvons Windows Vista, nous utilisons ces deux lignes de code pour ouvrir le Gestionnaire de démarrage Windows puis définissons le système d'exploitation par défaut sur Windows Vista :

objStore.OpenObject BootMgrId, objBootMgr 
objBootMgr.SetObjectElement _
  DefaultType, objObject.ID 

C'est tout ce pour quoi nous avons le temps ce mois. Après tout, même les Scripteurs ne peuvent pas gérer une excitation incessante 24 heures sur 24, 7 jours sur 7. Mais ne vous n'inquiétez pas. Nous reviendrons le mois prochain avec un autre volet passionnant de Hé, vous le Scripteur ! Avec un peu de chance, vous aurez récupéré d'ici là.

Les scripts embrouillés du Dr. Scripto

Le défi mensuel qui teste non seulement votre capacité à résoudre des énigmes, mais également vos compétences d'écriture de scripts.

Juillet 2008 : Carrés VBScript

D'accord, il s'agit probablement de rectangles, et pas de carrés, mais cela n'a rien à voir. Pour résoudre cette énigme, placez chaque carré sur la droite dans un carré vide sur la gauche pour créer les noms de fonctions VBScript. Chaque carré n'est utilisé qu'une fois. Voici un exemple :

Pour résoudre correctement cet exemple, vous devez déplacer le carré (rectangle) OU vers le carré vide dans le premier mot et le MS et le OX vers les carrés vides dans le deuxième mot. Cela donne les fonctions VBScript UBound et MsgBox, comme montré :

À votre tour :

RÉPONSE :

Les scripts embrouillés du Dr. Scripto

Réponse : Carrés VBScript, juillet 2008

Les scripteurs travaillent pour (enfin, sont employés par) Microsoft. Lorsqu’ils ne sont pas en train de jouer au base-ball, d’entraîner une équipe ou de regarder un match (ou de se livrer à de multiples autres activités), ils dirigent le Script Center TechNet. Vous pouvez le vérifier vous-même sur www.scriptingguys.com.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.