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 :

  1. Il va nous falloir une implémentation récente de PHP fonctionnant sous Windows (ça va, c’est pas trop dur à trouver)
  2. Comme je n’ai pas envie de m’emmerder avec IIS, je ne vous parlerai (très peu) d’Apache. Sous Windows.
  3. Nous aurons besoin d’une extension de PHP qui ne se trouve que… sur Windows. Et sous la forme d’une DLL
  4. 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.
  5. 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.
  6. Vous avez vu, j’ai encore collé deux acronymes dans les lignes précédentes, hihi !
  7. 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.

Montre ton amour pour Dédé en partageant cet article !

1 commentaire

Laisser un commentaire