Exploration WMI
WMI (Windows Management Instrumentation) est une normalisation des interfaces systèmes en informatique. L’auteur en est le groupe DMTF (Distributed Management Task Force) auquel appartient Microsoft, parmi plusieurs autres membres (Intel, IBM, Sun, Dell…).
De cette initiative est née la norme CIM (Common Information Model) qui estun schéma orienté objet pour la gestion des systèmes, des réseaux, desapplications, des bases de données et des périphériques. Le tout, administrable à partir d’une même interface normalisée. C’est l’environnement Windows, avec le standard WBEM/CIM, qui a le mieux exploité la norme WMI. Il est apparu pour la première fois dans le service Pack 4 de Windows NT 4.0 en 1998. Depuis il est présent dans Windows 2000, XP, VISTA, W7 et .NET Server.
En principe, WMI permet d’atteindre les ressources d’un ordinateur – et de toutes les machines basées sur un réseau Windows – pour les configurer et les interroger. On aura aussi la possibilité de gérer ces ordinateurs, de recevoir des alertes, de faire exécuter un programme, d’arrêter un service, ou de le lancer.
Architecture WMI et son accès:
(D’après L. Dardenne)
Il est possible d’atteindre la couche WMI avec différents langages de programmation, scripts et outils prévus à cette fin. D’autre part, pour la seule interrogation des propriétés des ressources gérées, il existe langage WQL.
WQL est un langage d’interrogation en lecture uniquement, on ne peut pas modifier le référentiel CIM par les instructions Insert ,Update et Delete, qui d’ailleurs n’estpas supporté. Ce langage est dérivé du langage d’interrogation structuré SQL ANSI. A la différence de SQL, WQL interroge des classes et non des tables, et retourne des classes et/ou des instances au lieu de lignes. WQL n’est pas du SQL mais y ressemble sous plusieurs aspects.
Interrogation WQL
L’utilitaire Explorateur WMI Volvox permet d’explorer facilement les classes de Windows (2000, XP, Vista, W7, Server .net) et de filtrer les propriétés utiles. Il y a plus de 800 classes à explorer dans root\CIM qui est l’espace de nom (namespace) à la racine des ressources.
Exemple. L’expression WQL suivante interroge les comptes:
[ SELECT * FROM Win32_Account ]
Elle est tirée directement de l’utilitaire parmi les classes favorites. On l’interroge parmi beaucoup d’autres classes accessibles dans l’ordinateur et proposées par l’Explorateur WMI. On pourra préciser la recherche initiale avec des opérateurs reconnues par WQL, par exemple WHERE:
SELECT * FROM Win32_Account
WHERE name = ‘Utilisateurs‘
AND
sidtype = ‘4‘
Parmi toutes les requêtes simples accessibles par l’intermédiaire de WMI, les plus populaires pour Windows 32 sont présentées dans le volet Favoris du logiciel.
Aperçu graphique de l’Explorateur WMI Volvox
Il est possible de se connecter sur plus d’un ordinateur en même temps dans la même session, qu’il soit local, dans un réseau ou accessible depuis l’internet par son adresse IP. Exemple:
[ Utilisation du logiciel ]
L’utilitaire est portable et ne nécessite aucune installation ou formalité autre que de l’exécuter à partir de votre ordinateur ou d’une clé USB. On utilise une Connexion pour chaque ordinateur rejoint ou chaque racine WMI interrogée. On choisira de préférence la racine root\CIMV2, qui englobe toutes les classes comprises dans les ressources de votre ordinateur. Une adresse locale est identifiée par le nom de l’ordinateur sur le réseau ou par ‘localhost‘ s’il s’agit de son propre ordinateur. Il est aussi possible d’entrer l’adesse IP d’un ordinateur, qu’il soit local ou distant. Une fois connecté, double-cliquez sur une classe exposée à gauche de l’application, par exemple [ Win32_IP4RouteTable ] pour que la requête s’inscrive dans l’éditeur WQL de droite de cette façon: [ select * from Win32_IP4RouteTable ]. Exécutez cette requête [cliquez sur le crochet vert] pour obtenir un résultat si disponible. Les propriétés de chaque classe sont visibles au bas de la fenêtre à gauche et répétées dans les résultats s’il y a lieu. Vous pouvez sauvegarder une requête inscrite dans l’éditeur et la rappeler plus tard. Vous pouvez aussi imprimer le résultat de la requête. Une bande-filtre au bas de la fenêtre permer de chercher un terme parmi tous les résultats obtenus ou de le surligner en respectant ou non la casse du mot cherché.
[ Téléchargement ]
Complément d’information: pour explorer plus à fond l’architecture WMI, l’interrogation WQL et autres sujets connexes:
Milani S. 2009. Brève sur WMI (Windows Management Instrumentation). Excellente présentation et de bonnes références sur WMI et son architecture.
Dardenne L. 2009. Qu’est-ce que WQL ? FAQ Delphi de Developpez.com. Très bon article avec exemples de requêtes WQL. Autres articles de Dardenne sur le sujet et la programmation WMI en Delphi.
Friedrich M. 2009. Making WMI Queries In C++. The Code Project. Pour une programmation très proche de celle utilisée dans l’Explorateur WMI.
MSDN 2009. Using WMI. La référence absolue pour Windows.
MSDN 2009. Querying with WQL. Entre autres pour voir tous les opérateurs WQL.
MSDN 2009. Extended WMI Query Language. Permet d’étendre le langage WQL avec d’autres opérateurs (Order By, Join, Count …).
WMI pour Linux? – Non, pas vraiment. Le kernel Linux expose déjà beaucoup d’information plus ou moins accessible sur /proc and /sys. Il n’y a pas de langage standard d’exploration comme tel, mais un effort a été fait avec SBLIM : « SBLIM (pronounced « sublime »), the Standards Based Linux Instrumentation for Manageability is an IBM-initiated Open Source project, intended to enhance the manageability of GNU/Linux systems. It does so by enabling WBEM, Web Based Enterprise Management. »
Pc Info Culture
En marge de mon article sur les Types de Caractères en Programmation, il peut être intéressant de connaître les ‘Types de Cultures’ ou langues disponibles dans notre ordinateur – de cette manière on saura si notre ordinateur est bien cultivé! En fait, on connait déjà la ‘culture’ en cours dans notre ordinateur puisqu’on l’a installé dans les ‘Options Régionales’ du Panneau de Configuration. Mais il en existe beaucoup d’autres, parfois des centaines, mises en place par Windows ou par nous lors de l’installation de logiciels. C’est ce que nous fait découvrir l’utilitaire Pc Info Culture.
L’application liste toutes les langues reconnues par le système (merci à l’unicode) ainsi que leurs propriétés. Entres autres, on y trouvera le code de la culture (fr-CA etc.), l’identificateur de paramètres régionaux LCID, ainsi que la page code utilisée, cette dernière information étant un standard informatique qui vise à donner un numéro à chaque caractère d’une langue.
Exécution de PcInfoCulture sur mon ordinateur: 240 langues et variantes répertoriées.
Téléchargement:
Complément d’information:
MSDN. Configurable Language and Cultural Settings (en). Tout sur la culture par Microsoft.
Israel Science and Technology. Windows Locale Codes Sorted by Locale ID (LCID). Entre autres, les pages codes et leurs caractères.
Volvox – [Char] La boite de caractères à copier/coller dans vos documents. Un aperçu visuel ici.
Types de Caractères en Programmation
En programmation, les types de caractères utilisés dans les documents ont une importance capitale. Comme référence, j’ai monté ce tableau et ajouté quelques notes qui me sont utiles.
| Nom | Bytes/Car. | Description | Étendue | Code IANA |
|---|---|---|---|---|
| 7-bit ASCII 7-bit US-ASCII |
1 | La mère de tous les caractères. Contient 32 caractères invisibles pour le contrôle, les lettres latines A-Z, a-z, les chiffres arabes 0-9 et beaucoup de caractères de ponctuations. | 0..127 | US-ASCII |
| Caractères Unicode | ||||
| Unicode, ISO 10646 | N.A. | Code universel pour tous les caractères imaginables. Défini le caractère, lui assigne une valeur scalaire, mais ne défini pas comment le caractère doit être rendu graphiquement ou placé en mémoire. | U+0000.. U+100000 |
N.A. |
| UTF-8 | 1..6 | Une variante de l’Unicode qui utilise 1 byte pour tous les caractères 7-bit US-ASCII et des séquences jusqu’à 4 bytes pour tous les caractères unicodes. | Tous les caractères Unicode | UTF-8 |
| UCS-2 | 2 | Une variante de l’Unicode qui utilise 2 bytes (16 bits) pour chaque caractère. Ce format n’est pas en mesure d’assigner une valeur scalaire à tous les caractères Unicode et est donc déclassé. | U+0000.. U+FFFF |
ISO-10646-UCS-2 |
| UTF-16 | 2 | Un format eploitant le concept « Surrogate Pairs » [1], qui utilise 2 Bytes (16 bits) pour chaque caractère. Supporte tous les caractères Unicode. Ce faisant, chaque caractère est codé sur une suite de un ou deux mots de 16 bits. | Tous les caractères Unicode | UTF-16 |
| UCS-4 UTF-32 | 4 | Une variante Unicode qui utilise 4 bytes (32 bits) pour chaque caractère. UCS-4 et UTF-32 sont les seuls formats capables de rendre tous les caractères sans exception en format long, utile par exemple pour traiter les APIs. UCS-4 et UTF-32 sont techniquement semblables. |
Tous les caractères Unicode | ISO-10646-UCS-4 UTF-32 |
| Caractères d’un seul Byte | ||||
| ISO 8859-x | 1 | Une extension de US-ASCII utilisant le codage de caractères sur 8 bits. | 0..127 160..255 | ISO-8859-x |
| Windows 125x | 1 | Semblable à ISO 8859-x sauf quelques caractères et ajout de caractères additionnels dans l’étendue 128..159. | 0..255 | windows-125x |
Ensemble de Caractères ISO 8859-x
Ces caractères sont une extension de l’ ASCII où le 8ième bit est utilisé. L’étendue 0..127 est identique à celle de l’ US-ASCII [Pour contrepartie Linux voir cette référence].
| Nom | Familier | Familles de langues | Contrepartie MS Windows |
|---|---|---|---|
| ISO 8859-1 | Latin-1 | Langues européennes de l’Est et de l’Ouest (Anglais, Alemand, Français, Espagnol, Portugais, etc.)
Largement utilisé (Europe, Ameriques, Australie, Afrique), donc parmi les caractères les plus communs sur le net. |
windows-1252 |
| ISO 8859-2 | Latin-2 | Langues de l’Europe de l’Est et Central (Tchèque, Slovaque, Polonais, etc.) | windows-1250 |
| ISOÂ 8859-3 | Latin-3 | Europe du Sud, Malte, Esperanto | |
| ISOÂ 8859-4 | Latin-4 | Europe du Nord | |
| ISO 8859-5 | Cyrillic | Russie, Ukrainien | windows-1251 |
| ISO 8859-6 | Arabic | Arabe | windows-1256 |
| ISO 8859-7 | Greek | Grec moderne | windows-1253 |
| ISO 8859-8 | Hebrew | Hébeux | windows-1255 |
| ISOÂ 8859-9 | Latin-5 | Turque | windows-1254 |
| ISOÂ 8859-10 | Latin-6 | Nordique (Sami, Inuit, Icelandais) | |
| ISO 8859-11 | Thai | Thai | windows-874 |
| ISOÂ 8859-13 | Latin-7 | Baltique | windows-1257 |
| ISOÂ 8859-14 | Latin-8 | Celtique | |
| ISO 8859-15 | Latin-9 | Langues de l’Europe de l’Ouest. Semblable à ISO 8859-1, plus les symboles Euro (€) et quelques autres caractères. | |
| ISO 8859-16 | Latin-10 | Langues Européennes du Sud-Est (Albanais, Croate, Hungrois, Italien, Polonais, Roumain, Slovenien, et aussi le Finlandais, Frençais, Allemand et le gaélique Irlandais) |
Ensembles de caractères MS Windows
Spécifiques à MS Windows, ces caractères sont semblables à l’ISO 8859, mais non tous les mêmes. Alors que l’ISO 8859 n’identifie pas de caractères dans l’étendue 128..159, MS Windows le fait. Les caractères de 0..127 sont identiques à l’US-ASCII. La plupart des caractères de 160..255 sont les mêmes que ceux de l’ISO 8859. Pour Linux voir ces informations.
| Numéro | Nom |
|---|---|
| 1250 | Latin 2 |
| 1251 | Cyrillic |
| 1252 | Latin 1 |
| 1253 | Greek |
| 1254 | Latin 5 |
| 1255 | Hebrew |
| 1256 | Arabic |
| 1257 | Baltic |
| 1258 | Viet Nam |
| 874 | Thai |
Chaque document XML doit débuté par la spécification de l’encodage – exemple:
< ?xml version="1.0" encoding="iso-8859-1" ? >
Cette spécification décrit le type de caractère utilisé tout le long du document. On utilise le Code IANA/MIME montré plus haut dans le tableau.
L’en-tête du document HTML doit comprendre le type de caractère utilisé – exemple:
< head >
< meta http-equiv="Content-Type" content="text/html; charset=windows-1252" >
...
< /head >
Sans cette déclaration (et en fait sans aussi n’importe quelle déclaration DOCTYPE), la validationW3C ne pourra pas être faite.
L’Internet Assigned Numbers Authority (IANA) maintient un liste de caractères et codes utilisés sur l’internet. Voir: IANA-CHARSETS Official Names for Character Sets.
Alors que les versions antérieures de Delphi utilisaient le type String basé sur les caractères ANSI de seulement 1 byte de longueur, Delphi 2009 défini un nouveau String basé sur l’Unicode avec le type WideChar d’une longeur de 2 bytes. Delphi 2009 est maintenant 100% compatible Unicode avec la définition d’un nouveau type appelé UnicodeString remplaçant de facto ce qu’était le type String. Auparavant, le type String était synonyme de AnsiString (type de caractère toujours disponible dans Delphi 2009 comme le sont AnsiChar et le pointeur PAnsiChar).
Dans Delphi 2009, les types de caractères sont maintenant Char, AnsiChar et WideChar, où Char est par défaut un WideChar. Avant Delphi 2009, un Char aurait été l’équivalent de AnsiChar. Pour une compilation identique à celle des versions précédentes, on doit changer Char en AnsiChar (et aussi PChar en PAnsiChar).
Les types de String les plus important sous Delphi 2009 sont : UnicodeString, WideString, AnsiString, UTF8String (un AnsiString avec l’encodage UTF-8) et finalement ShortString. Le String par défaut est équivalent à UnicodeString, qui sont des caractères WideChar gérés par Delphi (et non par Windows).
Références additionelles:
Unicode.org Glossary of unicode Terms.
Czyborra.com  ISO 8859 Alphabet Soup.
W3schools.com XML Encoding.
Pyzine.com / Michael Foord A Crash Course in Character Encoding (pour Python).
Ubuntu.com Unicode – the Universal Character Set
Marco Cantù Delphi and Unicode.
Extension WordPress Twitter
Code simple qui permet d’afficher les derniers messages de votre compte Twitter dans une section choisie de votre carnet wordpress.
// Affiche vos messages Twitter dans WordPress. Insérez tout
// simplement la fonction « ?php twitter_messages("twitterusername"); ? »
// Ã l'endroit voulu sur une section de votre theme.
// Préformté si list=true. Remplacer TwitterUserName par votre
// nom usager Twitter. License: GPL
//
define( 'MAGPIE_CACHE_ON', 1 );
define( 'MAGPIE_CACHE_AGE', 180 );
define( 'MAGPIE_INPUT_ENCODING', 'UTF-8' );
define( 'MAGPIE_OUTPUT_ENCODING', 'UTF-8' );
$twitter_options[ 'prefix' ] = 'twitter';
function fetch_rss_with_request_headers( $url, $request_headers = array() )
{
// initialise constante
init();
if ( !isset($url) ) {
return false;
}
// if cache is disabled
if ( !MAGPIE_CACHE_ON ) {
// fetch file, parse it
$resp = _fetch_remote_file( $url );
if ( is_success( $resp->status ) ) {
return _response_to_rss( $resp );
}
else {
return false;
}
}
// else cache est ON
else {
$cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );
if (MAGPIE_DEBUG and $cache->ERROR) {
debug($cache->ERROR, E_USER_WARNING);
}
$cache_status = 0; // reponse de check_cache
$rss = 0; // parsed RSS object
$errormsg = 0; // erreur !
if (!$cache->ERROR) {
$cache_status = $cache->check_cache( $url );
}
// if object cached, and cache is fresh, return cached object
if ( $cache_status == 'HIT' ) {
$rss = $cache->get( $url );
if ( isset($rss) and $rss ) {
$rss->from_cache = 1;
if ( MAGPIE_DEBUG > 1) {
debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
}
return $rss;
}
}
// else attempt a conditional get
// setup headers
if ( $cache_status == 'STALE' ) {
$rss = $cache->get( $url );
if ( isset($rss->etag) and $rss->last_modified ) {
$request_headers['If-None-Match'] = $rss->etag;
$request_headers['If-Last-Modified'] = $rss->last_modified;
}
}
$resp = _fetch_remote_file( $url, $request_headers );
if (isset($resp) and $resp) {
if ($resp->status == '304' ) {
// copie la plus actuelle
if ( MAGPIE_DEBUG > 1) {
debug("Got 304 for $url");
}
// reset cache sur 304
$cache->set($url, $rss);
return $rss;
}
elseif ( is_success( $resp->status ) ) {
$rss = _response_to_rss( $resp );
if ( $rss ) {
if (MAGPIE_DEBUG > 1) {
debug("Fetch successful");
}
// ajouter objet a la cache
$cache->set( $url, $rss );
return $rss;
}
}
else {
$errormsg = "Failed to fetch $url. ";
if ( $resp->error ) {
// compense pour '\n'
$http_error = substr($resp->error, 0, -2);
$errormsg .= "(HTTP Error: $http_error)";
}
else {
$errormsg .= "(HTTP Response: " . $resp->response_code .')';
}
}
}
else {
$errormsg = "incapable de trouver le fil RSS pour une raison inconnue.";
}
// autrement fetch erreur
// retourner objet caché
if ($rss) {
if ( MAGPIE_DEBUG ) {
debug("Returning STALE object for $url");
}
return $rss;
}
// echec total
error( $errormsg );
return false;
} // end if ( !MAGPIE_CACHE_ON ) {
}
// Afficher les messages Twitter
function twitter_messages( $username = 'TwitterUserName', $num = 5, $list = true, $update = true, $linked = '# Twitter', $hyperlinks = true, $twitter_users = true, $encode_utf8 = true )
{
global $twitter_options;
include_once( ABSPATH . WPINC . '/rss.php' );
$messages = fetch_rss( 'http://twitter.com/statuses/user_timeline/' . $username . '.rss' );
if( $list )
echo
'
«ul class="twitter"»;
if( $username == '' )
{
if( $list )
echo
'
«li»';
echo 'RSS not configured';
if( $list )
echo
'«/li»
';
}
else
{
if( empty( $messages -> items ) )
{
if( $list )
echo
'
«li»';
echo 'Aucun message.';
if( $list )
echo
'«/li»
';
}
else
{
$i = 0;
foreach( $messages -> items AS $message )
{
$msg = " " . substr(strstr( $message[ 'description' ], ': '), 2, strlen( $message[ 'description' ])) . " ";
if( $encode_utf8 )
$msg = utf8_encode( $msg );
$link = $message[ 'link' ];
if( $list )
echo
'
«li class="twitter-item"»';
else
if( $num != 1 )
echo
'
';
if( $linked != '' || $linked != false )
{
if( $linked == 'all' )
$msg = '<a class="twitter-link" href="' . $link . '">' . $msg . '</a>';
else
$msg = $msg . '<a class="twitter-link" href="' . $link . '">' . $linked . '</a>';
}
if( $hyperlinks )
$msg = hyperlinks( $msg );
if( $twitter_users )
$msg = twitter_users( $msg );
echo $msg;
if( $update )
{
$time = strtotime( $message[ 'pubdate' ] );
if( (abs( time() - $time) ) < 86400 )
$h_time = sprintf( __( '%s ago'), human_time_diff( $time ) );
else
$h_time = date(__( 'Y/m/d'), $time );
echo
sprintf( __( '%s', 'twitter-for-wordpress'), ' <span class="twitter-timestamp"><abbr title="' . date(__( 'Y/m/d H:i:s'), $time ) . '">' . $h_time . '</abbr></span>' );
}
if( $list )
echo
'
';
else
if( $num != 1 )
echo
'
';
$i++;
if( $i >= $num )
break;
}
}
}
if( $list )
echo
'
';
}
// Links
function hyperlinks( $text )
{
// match protocol://address/path/file.extension?some=variable&another=asf%
$text = preg_replace("/\s([a-zA-Z]+:\/\/[a-z][a-z0-9\_\.\-]*[a-z]{2,6}[a-zA-Z0-9\/\*\-\?\&\%]*)([\s|\.|\,])/i"," <a class="\"twitter-link\"" href="\">$1</a>$2", $text );
// match www.something.domain/path/file.extension?some=variable&another=asf%
$text = preg_replace("/\s(www\.[a-z][a-z0-9\_\.\-]*[a-z]{2,6}[a-zA-Z0-9\/\*\-\?\&\%]*)([\s|\.|\,])/i"," <a class="\"twitter-link\"" href="\">$1</a>$2", $text );
// match name@address
$text = preg_replace("/\s([a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]*\@[a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]{2,6})([\s|\.|\,])/i"," <a class="\"twitter-link\"" href="\">$1</a>$2", $text );
return $text;
}
function twitter_users( $text )
{
$text = preg_replace( '/([\.|\,|\:|\¡|\¿|\>|\{|\(]?)@{1}(\w*)([\.|\,|\:|\!|\?|\>|\}|\)]?)\s/i', "$1<a class="\"twitter-user\"" href="\">@$2</a>$3 ", $text );
return $text;
}
?>
Note: dans le listing, remplacez les balises « et » par < et >. On peut prendre ce code [twitter_ex.php] dans le bon format *ici*.
Alice the Thing – PhiloSURFical part.1
Avec pour objectif une refonte de la feuille de temps Alice (une demande qui m’est faite), je m’inspire du projet PhiloSURFical et de ses concepts. La feuille de temps sera tirée d’un document XMl [temps-ontologie.xml] qui devrait sructurer tous les termes et concepts inhérents à l’utilisation du temps dans un projet – et qui sont réels!
La strucure initiale:
Détail de l’entité CRM:
Quelques références:
Mikele Pasin. PhiloSURFical – Project Site. PhiloSURFIcal is a tool for browsing a philosophical text, taking advantage of a map of the concepts relevant to the text. – Carnet Web de Mikele Pasin.
Karl Dubost. Ergonomie des feuilles de temps [Partie 1] [Partie 2].  «Un système souple de saisie de données qui soient le moins contraignant possible mais qui reflète la structure sociale de l’entreprise et la véritable organisation du travail.» Carnet Web de Karl Dubost.
Outils (pour le moment): Delphi 2009, XMLBluePrint, Protégé, GraphViz.

1 Commentaire










