L’article précédent, « Si t’as pas d’ami, prends un cURL ! » m’a donné quelques mots de tête. Je me demandais bien où j’avais pu merder pour n’obtenir qu’une horrible page d’erreur HTTP 403, Forbidden… Après avoir essayé toutes les solutions données sur le web, comme désactiver les plugins un par un, faire un chmod sur les dossiers et fichiers, etc etc, j’ai finalement eu une révélation…
Catégorie : PHP
Quand Dédé fait du php
Interroger l’AD en PHP (4)
Nous avons mis en place pas mal d’éléments dans les articles précédents de cette passionnante série. Aujourd’hui, nous allons passer au cas pratique – et donc à la programmation – en créant un petit formulaire HTML, qui sera rempli avec les données de l’AD via une fonction Ajax appelant un script PHP ! Rassurez-vous, c’est beaucoup plus simple que ça en a l’air. Lancez votre éditeur de texte ou IDE préféré, accrochez vos ceintures et bretelles, et c’est parti !
Interroger l’AD en PHP (3)
Nous avons vu dans l’article précédent comment récupérer les propriétés d’un compte utilisateur depuis l’AD, mais aussi de déterminer avec Powershell quelles sont les propriétés de n’importe quel type d’objet. Le souci avec les comptes d’utilisateur ou d’ordinateur, c’est qu’ils peuvent être désactivés et donc n’accèdent plus au domaine. Vous devez absolument en tenir compte, notamment dans l’exemple d’application de login que nous allons créer.
Interroger l’AD en PHP (2)
La fois précédente, nous avons vu comment interroger l’AD, mais avec une requête tellement simpliste qu’elle sort beaucoup trop de résultats (certes, qui peut le plus peut le moins, mais on atteint vite la limite des 1000 objets dont j’ai déjà parlé). Pour améliorer les choses, il suffit d’être un peu plus précis dans la requête en choisissant le type d’objet qui nous intéresse (un compte d’ordinateur, ou un compte utilisateur par exemple), et de cibler un peu plus précisément l’OU où chercher ces objets.
Mais tout d’abord, simplifions-nous un peu la vie.
Interroger l’ActiveDirectory en PHP
Il y a quelques années de ça, je tentais désespérément de bricoler une appli qui se baserait sur l’AD de mon client préféré pour tout ce qui est authentification et gestion des droits. Ce fût un misérable échec (un parmi tant d’autres), un epic fail même, puisque mon compte perso (je n’en avais pas d’autres) fut bloqué à maintes reprises. Coup de bol, j’étais dans le bureau à côté du support, et je pouvais les harceler pour qu’ils me le réactivent fissa. Je savais que je m’y prenais mal – ce qui du coup bloquait mon compte après plusieurs tentatives de connexion – sans mettre le doigt sur l’origine du problème. Il faut dire que je manquais d’éléments pour faire les choses correctement, les exemples trouvés sur le net étaient des plus catastrophiques, et de guerre lasse, je me plongeais plutôt dans le SAML, vu que Big Client avait mis en place un fort pratique SSO.
Mais aujourd’hui, les choses ont changé, j’ai un compte avec bien plus de droits qu’ils ne m’en faut (aka admin du domaine… le Saint Graal quoi), une bien meilleure connaissance de l’AD chez Big, et un peu de temps pour faire quelques expériences inoffensives. Je me suis donc replongé dans le manuel de PHP, avec la ferme intention d’interroger l’AD et de terminer enfin la série noire des mes échecs passés (et je ne parle que de ceux liés à la programmation. Pour le reste, hmm… c’est pas gagné).
WMI, PHP et plein d’autres trucs en trois ou quatre lettres (part 2)
Avant de lire cette deuxième partie, (re)lisez la première, merci. Je prends la responsabilité de l’infinite loop qui en résultera.
Des problèmes apportés par la délocalisation dans un PVD de la traduction des noms de services chez Microsoft
Avant de jouer avec wbemtest, il y a un tout petit truc à savoir : WMI est activé par défaut sur les versions de Windows postérieures à XP. Donc si c’est votre cas, vous n’allez pas avoir à faire grand chose de ce chapitre. Par contre, si vous avez XP, il va falloir vérifier qu’un service est bien démarré.
En anglais, ce service est judicieusement appelé Windows Management Instrumentation (oh bah dites donc, en abrégé ça donne l’acronyme WMI, c’est pratique). Mais en français, patatras, le traducteur olmèque embauché à un salaire dérisoire a décidé que ce serait Infrastructure de gestion Windows et pas autre chose. Quel fourbe, ce patatras.
Donc cher lecteur, il ne te reste plus qu’à aller dans ton menu Démarrer préféré (si tu n’es pas sous Windows 8. Si c’est le cas, passe en 8.1 avec l’update de 3 Go qui suit, ça te simplifiera la vie, crois-moi), de cliquer sur Exécuter, et de taper dans la joie et l’allégresse services.msc tout en écrasant délicatement la touche Entrée de ton clavier pour finir.
Et sous tes yeux ébahis, tu verras apparaître une fenêtre similaire à ceci :
Sinon blogger, tu la centres quand tu veux et avec la taille que j’ai demandé, la capture d’écran, hein. |
Si le service est démarré, tout va bien, sinon tu le démarres et on n’en parle plus. Et en plus, tu gagnes un process svchost.exe à l’affaire, tu vois que tu n’es pas venu ici pour rien. Et si tu préfères la ligne de commande, tu peux aussi taper net start winmgmt et le tour est joué.
Tu peux pas test
Enfin si, et c’est justement ce que nous allons faire de ce pas, car je vous sens piaffer d’impatience depuis la fin de la première partie. Nous entrons désormais dans les choses sérieuses du vif du sujet, et pour cela, retournons d’une manière extatique dans le menu Démarrer, recliquons sur Exécuter, puis tapons de toutes nos forces webmtest avant de martyriser amoureusement la touche Entrée.
Et là bim, je dois faire une autre capture d’écran alors que ça ne sert à rien vu que vous allez avoir à peu de choses près la même chose que moi, c’est-à-dire ça :
Oui c’est moche mais c’est la beauté intérieure qui compte, voyons ! |
Inutile d’appeler GDF-Suez Engie ou les pompiers, car même si wbemtest ressemble à une usine à gaz, l’utilisation que nous allons en faire est des plus simplissimes qui soient. A tel point que vous vous en voudrez d’avoir cru que c’était compliqué.
Sans même vous poser de question, cliquez sur le bouton Connexion en haut à droite, la boîte de dialogue suivante apparaîtra comme par magie (mais en fait, c’est de la programmation tout ça, enfin j’espère que ce n’est pas un scoop pour vous) :
Ce n’est guère plus joli que la capture précédente, je sais. |
On se détend, et on ne touche à rien pour l’instant. On regarde seulement en haut de la fenêtre, l’encadré Espace de noms (toi-même, hé). Ce petit « rootcimv2 » a une certaine importance comme je vous le montrerai plus tard. Si vous avez bien vu et retenu, c’est bon, vous pouvez cliquer sur le bouton Connexion (oui encore, mais ce n’est pas le même bouton en fait).
Mais… il ne s’est rien passé !
Tu n’es pas très très observateur, jeune disciple. Regarde bien la première capture d’écran de wbemtest que je t’ai généreusement offert précédemment, puis ton wbemtest à toi. Tu ne vois rien de changé ? Non ? Toujours pas ? Regarde tous les boutons… ils ne sont plus grisés !
Maintenant que nous sommes connecté à l’espace de nom (ou namespace chez nos amis d’Outre-Rhin, qui parlent en général mieux anglais que nous) rootcimv2, nous allons pouvoir regarder un peu tout ce qui se cache là-dedans. Mais plutôt que d’y aller à l’aveuglette et de recourir aux arts divinatoires qui sont tout de même un peu foireux (hein, @levraihoroscope), nous allons demander gentiment mais fermement à wbemtest d’énumérer toutes les classes qu’il a à nous montrer. Et pour cela, rien de tel que de cliquer sur le bouton Énumérer les classes (quelle surprise).
Sauf qu’il ne va pas le faire tout de suite le bougre. Il va falloir faire des trucs mystérieux sur la boîte de dialogue qui surgit du fond de la nuit :
N’espérez pas voir de truc joli ici, allez dehors si c’est ce que vous recherchez |
Enfer et damnation ! Que faire ? Comme je n’arrête pas de vous seriner que WMI, c’est SIMPLE, je vais vous le prouver une fois de plus : sélectionnez l’option Récursive, puis cliquez sur OK. Allez vous préparer un café instantané au micro-ondes et revenez vite fait devant votre PC, car même wbemtest a besoin d’un peu de temps pour énumérer toutes les classes du namespace, ça ne prend tout de même pas des heures. Attendez simplement qu’il affiche Terminé là où était écrit Opération en cours… quelques instant auparavant (et que vous n’aviez pas vu car vous étiez occupé à faire votre café).
En forçant un peu sur la bouteille, vous trouverez cette boîte de dialogue sexy. Si, si ! |
Mais qu’est-ce que c’est que ce truc encore…
Décidément, vous et moi faisons les mêmes réflexions, à quelques semaines d’intervalle cela dit. Ceci est une liste. De classes WMI. Et oui, il y en a beaucoup. 1078 chez moi, sur le PC sur lequel j’écris fiévreusement cet article, peut-être plus ou moins chez vous… Aucune importance.
Vous vous souvenez certainement de la classe Win32_ComputerSystem que j’avais évoqué dans la première partie. Et bien nous allons la chercher à la mano souris en faisant défiler la liste des classes grâce à l’ascenseur latéral. Comme elles sont classées (la classe pour des classes) dans l’ordre alphabétique, les Win32_quelquechose sont plutôt vers la fin. Donc allez-y franco, lâchez-vous, allez tout en bas, puis remontez la liste jusqu’à trouver la classe qui nous intéresse. Ne tenez pas compte (pour l’instant) des trucs entre parenthèses.
Ah tiens chez moi elle est plutôt vers le milieu en fait… |
Et là je pousse un cri d’alarme retentissant (et pour une fois je ne déconne pas) : ne cliquez pas, JAMAIS, NEVER, sur le bouton Supprimer. Ni même sur Ajouter. Vraiment.
Bon ça ne cassera pas grand chose vu qu’au prochain reboot vous retrouverez tout, mais de manière règle, quand on ne sait pas, on ne fait pas, ou alors on se renseigne d’abord (proverbe d’informaticien du paléolithique, mais toujours valable de nos jours).
Par contre, ce que vous pouvez faire (et ça vous aidera dans la suite de cet article), c’est de double-cliquer sur la classe Win32_ComputerSystem (avec du blabla entre parenthèses après). Et là, nul doute que les plus impressionnables d’entre vous s’agenouilleront devant le miracle qui s’accomplit :
Tadaaaaaaa ! (non ce n’est pas le son de WinXP mais les trompettes des anges, m’enfin !) |
Oui, là ça devient magnifique. Moi-même je n’ai plus de mots pour décrire ça. Mais n’oubliez pas que WMI est la quintessence de la simplicité absolue, et regardez plus attentivement en plein milieu de la boîte de dialogue… Vous le voyez l’encadré Propriétés avec des machins (bah, des propriétés hein) dedans ?
Et bien figurez-vous que c’est dans ce fouillis qu’on va trouver ce qui nous intéresse, notamment Manufacturer et Model… Là, une petite explication s’impose. Le CIM_STRING après le nom de la propriété indique simplement son type (en l’occurrence, une chaîne, et pas le slip rabougri du cul que portent les filles). Ensuite vient la valeur de la propriétés. Si vous regardez attentivement, vous verrez des <null> partout.
Ta propriété en string ! |
C’est <null> ton truc !
Vu comme ça, oui, car ce que je vous ai fait faire jusqu’à présent ne permet que de lister les classes et leurs propriétés (ce qui évite le recours à la boule de cristal, assez peu efficace en la matière). L’idée est juste de vérifier qu’une propriété existe et son nom. Si vous voulez voir les valeurs, il va falloir jouer du WQL ! Oui, Microsoft aurait pu tout afficher du premier coup, on aurait tous gagné du temps, mais n’oubliez pas que les gens qui y travaillent sont un peu… spéciaux. Mais j’ai dans l’idée qu’afficher les valeurs de toutes les propriétés de toutes les classes pourrait prendre du temps, et même si ce n’est pas toujours de l’argent, c’est aussi le meilleur moyen de gaspiller de la RAM et de planter Windows (qui comme les grands féodaux, est fragile. Comprenne qui pourra.).
Je sais que vous mourrez d’impatience (ou d’ennui) et que vous rêvez (ou pas) de vous mettre tout de suite au WQL. Et bien c’est parti mon kiki.
Déjà, on va fermer les fenêtres (mais non, pas celle-là voyons, vous voyez bien qu’il fait chaud !) et revenir à la toute première de wbemtest, là où les boutons se sont dégrisés plus vite qu’au comico du coin. Cherchez bien et vous verrez un bouton Requête… (troisième colonne, deuxième ligne. Faut tout vous dire, hein). Cliquez dessus.
Dans le champ principal, tapez la seule requête que je vous ai appris jusqu’à présent :
Select * from Win32_ComputerSystem
Séquence émotion : votre première requête WQL |
Puis cliquez sur Appliquer. Un court instant plus tard, cette fenêtre apparaît :
Et ben ? Tout ça pour ça ? |
Un peu décevant, non ? Double cliquez sur la ligne Win32_ComputerSystem.Name= »lenomdevotrePC ». Rien ne se passe. Pendant que rien ne se passe, notez tout de même ce .Name= »lenomdevotrePC ». Si je vous dis que Name est une propriété de la classe Win32_ComputerSystem et que sa valeur est « lenomdevotrePC », ça vous épate hein ? Attendez encore un peu, car au moment où vous y attendrez le moins, wbemtest va ouvrir une troisième fenêtre sans crier gare… (et d’ailleurs sans crier tout court) :
C’est un Lenovo ! |
Voilà, on retrouve la même fenêtre que tout à l’heure mais cette fois-ci, plus de <null> (enfin beaucoup moins) et surtout je sais désormais que j’ai un Lenovo, et même que c’est un 20B7S3BR0T et… mais c’est quoi ce nom pourri ?!
Du respect des traditions informatiques
C’est là qu’arrive la sempiternelle comparaison avec une bagnole. Vous vous rappelez de la Renault 18 TL de votre papa ? (ou tonton, ou voisin, peu importe, ce n’est qu’un exemple. Mes parents avaient une 1510 GLS, mais vous vous en foutez je parie).
Bon ben là, Manufacturer c’est Renault, ok, mais si vous voyez par exemple 13400 dans Model, pas d’inquiétude, c’est ce qu’on appelle le type. Il y en a plusieurs (plein, même) pour des R18 qui se ressemblent pourtant comme deux gouttes d’eau.
Pour savoir que votre type 13400 est une R18 TL, il va falloir chercher ça ailleurs. Traduit en informatique, pour mon Lenovo 20B7quelquechose, il faut chercher la bonne propriété dans une autre classe. Et c’est là qu’on rigole.
Parce que soit vous avez de l’intuition, soit vous n’en avez pas, et donc il va falloir farfouiller dans les classes. Comme je suis sympa, je vais vous épargner ça, et vous indiquer qu’il s’agit de la propriété Version (oui bon, même avec de l’intuition c’est pas super intuitif, je vous l’accorde) de la classe Win32_ComputerSystemProduct !
On vérifie tout ça ? Allez zou, retour à la case départ, Requête, et on tape ça :
Select * from Win32_ComputerSystemProduct
On a la fenêtre de résultat, double-clic comme tout à l’heure, on attend pas deux plombes ce coup-ci et…
C’était donc un ThinkPad T440 ! Et dire que si j’avais regardé sous l’écran… |
Les plus perspicaces d’entre vous auront remarqué :
- Qu’on retrouve mon type 20B7trucmuche mais cette fois-ci la propriété s’appelle Name ?!
- Que Win32_ComputerSystem.Manufacturer ou Win32.ComputerSystemProduct.Vendor c’est kif-kif au niveau valeur mais le nom de la propriété n’a rien à voir ?!
- Que j’ai flouté, pixellisé et barré certaines informations sur mes captures d’écran. Et oui, la vie privée c’est important, et un simple numéro de série peut en dire tellement long sur vous… Pensez-y…
WMI a beau être la simplicitude absolue, il ne fallait pas vous attendre à trouver facilement une classe et une propriété avec le nom qui correspond au truc exact qu’on cherche intuitivement, hein ! C’est une chose à la fois frustrante mais satisfaisante, vous allez voir. Frustrante parce que vous passerez forcément des heures à chercher LA classe et LA propriété que vous vouliez. Mais satisfaisante car quand vous la trouverez, vous serez bien content !
Cela dit, avec l’habitude, on devine rapidement ce genre de piège et le temps de recherche diminue drastiquement, à tel point qu’on finit par se dire « Hé, franchement, Microsoft, trop simple, là, tu me sous-estime… ».
Conclusion
Vous savez désormais faire des requêtes WQL toutes simples. Entraînez-vous, farfouillez dans les classes à l’aide de wbemtest, et notez les classes et les propriétés qui vous intéressent, vous serez étonné de voir ce qu’on peut récupérer comme informations.
En guise de devoirs pour la prochaine fois, trouvez la classe (ou les classes) et les propriétés qui permettent d’afficher le fabricant, le modèle, le nombre de cores et la vitesse maximale du processeur de votre PC… Je corrigerai en commentaires.
WMI, PHP et plein d’autres trucs en trois ou quatre lettres (part 1)
Ce n’est que le deuxième article, et bam, deux acronymes dans le titre. Ça commence fort…
Acronymes et.. ah zut j’ai pas de rime
Bon, PHP, je ne vous ferai pas l’affront de dire ce que c’est. Si vous êtes venus dans ce trou perdu du web ici, c’est que vous en avez déjà entendu parler. WMI, par contre, même si vous programmez en PHP, il se peut que cela ne vous évoque rien, à fortiori si vous êtes sur Mac ou Linux.
Et oui, le W de WMI signifie Windows, et le reste (MI, donc) Management Instrumentation. En gros, il s’agit de l’implémentation à la sauce Microsoft du WBEM (rhololo, encore un acronyme à la c…), ou Web-Based Enterprise Management, sous Windows, donc. Ce qui a quelques implications du coup :
- Il va nous falloir une implémentation récente de PHP fonctionnant sous Windows (ça va, c’est pas trop dur à trouver)
- Comme je n’ai pas envie de m’emmerder avec IIS, je ne vous parlerai (très peu) d’Apache. Sous Windows.
- Nous aurons besoin d’une extension de PHP qui ne se trouve que… sur Windows. Et sous la forme d’une DLL
- Autrement dit, si vous êtes sur Mac, Linux ou autre que Windows, à part pour votre culture personnelle, cet article ne vous servira à pas grand chose.
- Hé tu oublies Wine ! Oui je l’oublie, car je n’ai pas la moindre idée si on peut faire du WMI avec Wine, et j’ai la flemme de chercher.
- Vous avez vu, j’ai encore collé deux acronymes dans les lignes précédentes, hihi !
- Et le mot de passe admin local de chaque PC, ou du domaine.
Le principe du WBEM (et donc de WMI) est de pouvoir accéder à des informations sur le matériel/logiciel local ou distant, pour peu que Windows soit installé dessus (mais pas n’importe quelle version de Windows : WMI est apparu avec (excusez-moi si je rigole, ce truc-là m’a toujours fait marrer) Windows Me, et n’existe donc pas sous Win95 et 98, ce qui n’est pas bien grave, vous en conviendrez).
C’est bien beau tout ça mais ça sert à quoi ?
Mettez-vous dans la peau d’un gestionnaire de parc (informatique, pas zoologique). Ce genre de personne rêve toutes les nuits (et la journée aussi) de savoir exactement et à tout moment ce qu’il possède. Pas juste le nombre de PC, non, ça il le sait, et au pire la compta a une trace des factures qu’il aura signé et oublié depuis. Non, lui, son kif c’est de savoir quels PC il a, avec quel processeur, combien de RAM, la taille des disques, la marque, le modèle, la température, les imprimantes connectées, bref il veut tout savoir. Parce que le gestionnaire de parc, c’est un peu un geek (enfin, un geek d’un genre un peu particulier cela dit).
Et bien WMI va permettre de bien l’aider (vous verrez, et cela ne se fera pas sans larmes de désespoir, je sais, je suis passé par là) mais pas totalement. Car malheureusement, vous découvrirez que même si WMI n’a rien de sorcier, il y a quelques pièges, des documentations foireuses, des propriétés manquantes et donc la désillusion n’est jamais loin. Mais dans l’ensemble, ça reste assez cool de jouer avec.
Avec WMI, on peut lire des informations sur un PC mais aussi en écrire (autrement dit, modifier les propriétés d’un objet). Je n’aborderai pas ce sujet (j’ai essayé, j’ai failli avoir des problèmes, hein). Quoi, toi, Dédé, parler d’objets ? Mais je croyais que tu haïssais la POO ?! Ben oui, mais c’est comme ça, tu peux faire de la programmation procédurale d’objets hein, ça coûte rien ! Et puis, comme vous verrez dans les exemples plus bas, on va faire dans le simple, dans le code de porc mais qui est compréhensible, bref le genre de truc qui va faire hurler les ayatollahs mais tant pis.
Certains me reprocheront peut-être de ne pas faire un cours magistral sur WMI des origines à nos jours, d’éluder certains aspects, d’ajouter de ci de là des approximations, ou d’omettre carrément des choses : je sais, j’assume. Le but de cette article est juste de vous donner envie de vous y mettre, pas de recopier tout ce qu’on trouve sur le MSDN…
Bon, assez d’acronymes, on s’y met quand ?
Pas tout de suite, il y a deux-trois choses à faire avant. D’abord, vous allez vous débrouiller pour avoir un Apache et un PHP qui tournent correctement sous Windows. Prenez ce que vous voulez, personnellement je ne me casse pas la tête, un EasyPHP fait très bien l’affaire. Ça s’installe tout seul, pensez juste à avoir des droits d’admin pour le faire, ça peut servir…
Une fois que tout ça fonctionne, il va falloir éditer le fichier de configuration de PHP (notre ami php.ini), et AJOUTER la ligne suivante (tant qu’à faire, juste après les lignes similaires) :
extension=php_com_dotnet.dll
Ensuite on enregistre, on arrête/redémarre Apache et le tour est joué. J’en vois déjà qui soulèvent leur sourcil droit en lisant « com » et « dotnet » dans le nom de la DLL… Et oui, on va utiliser COM (Component Object Model), mais pas .NET (qui le remplace de fait), mais le but de cette extension est de pouvoir faire discuter PHP avec ces deux-là. Je passe les détails pénibles, sachez juste qu’on va utiliser COM, et c’est tout.
Précisons toutefois qu’il existait une classe COM dans PHP, mais que ce n’est plus le cas depuis la version 5.4 quelque chose, et qu’il faut donc charger l’extension COM/.NET. J’avais bien dit au début d’utiliser un PHP récent, hein, et pis c’est mieux, d’abord. Mais pas d’inquiétude : sur la machine sur laquelle je tape cet article, j’ai une version 5.4.24, et ça marche très bien (les autres sont en 5.6 et ça marche très bien aussi).
C’est bon là ? (et y’a plus d’acronymes ?)
Non ce n’est pas bon, encore un dernier point à voir, et si, un acronyme supplémentaire (en fait, à la réflexion, deux) : WQL. Et SQL.
Commençons par le deuxième : vous le connaissez probablement, je ne parle pas du SQLServer de Microsoft, mais bien du langage SQL, langage fort amusant s’il en est, puisqu’étant un standard, chaque éditeur de base de données a son propre dialecte, sinon ce n’est pas drôle. Si vous programmez en PHP, il y a de fortes chances que vous ayez joué avec MySQL (ou MariaDB), et vous allez voir que WQL est vraiment très proche du SQL de MySQL. Ou de SQLServer. Mais peu importe, vous allez voir c’est très simple.
Au même titre de WMI est du WBEM sauce MS, et bien WQL est du CQL goût Billou. Ce qui nous fait donc trois acronymes, qui se terminent tous par QL : Query Language. C’est ça l’important. Oui, on va faire des requêtes (queries) à WMI dans un langage qui ressemble à s’y méprendre à du SQL.
Rhaaa
Oui, ça m’a aussi fait ça la première fois. Mais c’est réellement très très simple, promis. En gros, nous allons nous connecter à WMI comme on le fait à une base de données MySQL (sauf qu’on passe par une connexion COM), et on indique dans la requête la table (en réalité, une classe) qui nous intéresse et ce qu’on veut faire avec elle. Voici un exemple de requête WQL :
Select * from Win32_ComputerSystem
Quand je vous disais que ça ressemble à du SQL… Ici notre « table » s’appelle Win32_ComputerSystem, et la requête consiste à demander tous les « enregistrements » de cette « table », c’est aussi simple que ça. Sauf qu’à la place d’un tableau (array), nous aurons en retour un objet (de type variant), pour autant que la requête ait bien été exécutée.
Au niveau de la syntaxe, peu importe la casse (vous pouvez ainsi écrire SELECT ou select ou Select), sauf pour le nom de la classe WMI. Là, gare aux fautes de frappe.
Comme n’importe quel objet, celui qui nous est retourné possède des propriétés, et ce sont elles qui nous intéressent particulièrement. Par exemple, dans cette classe Win32_ComputerSystem, on trouvera entre autres les propriétés Manufacturer ou Model, qui nous indiquerons respectivement le constructeur du PC (Lenovo, Dell, etc…) et son modèle (sauf que… pas toujours… et même jamais en fait, dans le cas de Lenovo !).
Et oui, joie et bonheur, il vous faudra assez souvent reconstituer les informations dont vous avez besoin en faisant plusieurs requêtes…
OK cool, mais on fait comment pour trouver les bonnes infos ? Faut deviner ?
Oui et non ! En fait, dans sa grande mansuétude, Microsoft offre aux développeurs deux ressources qui vont s’avérer salutaires dans bien des cas, et destructrices de cheveux dans bien des autres. Tout d’abord, le MSDN dont j’ai déjà parlé plus haut offre une documentation assez exhaustive de ce qu’on peut trouver dans les classes WMI fournies par Windows. Mais malheureusement, vous tomberez souvent sur des propriétés obsolètes (deprecated) ou carrément inexistantes sur les PC qui vous interrogerez, alors que c’était justement ça qu’il vous fallait. Enfin, certaines propriétés n’existent qu’à partir de telle ou telle version de Windows (donc ce n’est pas une mauvaise idée que de commencer par savoir à qui vous vous adressez, ça vous évitera de tenter d’obtenir une propriété fantôme…). Pour finir, certaines propriétés sont un tantinet pénibles à décoder, parce que vous devrez créer des tableaux de correspondances de valeur (ex : 0 ça veut dire ceci, 1 veut dire cela), ou vous amuser à faire un peu de logique avec des bitmasks (merci de vous abstenir de toute réflexion vaseuse quant à ce terme).
L’autre possibilité est d’utiliser l’outil wbemtest fourni gracieusement par Microsoft qui va vite devenir votre meilleur ami (si vous n’avez pas de vie sociale et que jouer avec WMI a fait naître chez vous une vocation insoupçonnée). Je reparlerai de lui dans la prochaine partie de cet article déjà fort long.