La boîte à Tutoriels de Christopher PECAUD

Utilisation de la bibliothèque OLEPRNLIB avec VBA sous Excel

Laisser un commentaire

SOMMAIRE

I Introduction
II Prérequis
III Ecriture de la macro
IV Conclusion

I Introduction

Dans ce tutoriel vous allez apprendre comment utiliser la bibliothèque de fonctions OLEPRNLIB.dll en association avec le langage VBA. Vous pourrez ainsi obtenir des informations spécifiques sur vos imprimantes en utilisant le protocole SNMP. Vous verrez de même comment utiliser une application de navigation de MIB (Mib Browser de iReasoning).

II Prérequis

Dans un premier temps je vous conseille d’installer une petite application qui vous permet de naviguer à l’intérieur d’une MIB (Management Information Base) est une base d’information structurée qui se veut la plus universelle possible. Ainsi chaque périphérique compatible avec SNMP dispose d’une même structure de base avec des noms de propriétés communs à tous les périphériques.

Ensuite le fabricant peut ajouter ses propres propriétés qui vont différencier le produit par rapport à un autre. Par exemple pour une imprimante les propriétés pour obtenir la quantité restante de toner peut varier d’un fabricant ou d’un modèle à un autre.

Ces paires de clé/valeurs sont des OIDs. Par exemple pour obtenir le descriptif du périphérique il faut utiliser l’OID « system.sysDescr.0 » ou .1.3.6.1.2.1.1.1.0

Pour télécharger Mib Browser allez sur le site de iReasoning sur ce lien.

Installez et ouvrez l’application, vous devriez voir apparaître cette fenêtre à l’écran :

description image

Pour l’utiliser il suffit de saisir l’adresse IP de l’imprimante et de sélectionner l’OID si vous le connaissez et sélectionnez ensuite le type d’opération que vous voulez appliquer à la recherche. Les opérations disponibles avec SNMP sont les suivantes :

  • Get permettant d’obtenir une seule valeur correspondant à un seul OID ;
  • GetNext permettant de récupérer la valeur de l’OID suivante dans l’arbre MIB ;
  • Walk permettant de parcourir toutes les OIDs à partir de l’OID sélectionnée ;
  • Get Subtree permettant de récupérer toutes les OIDs d’un sous arbre MIB par exemple si vous requêter cette opération sur le nœud System vous obtiendrez les clés/valeurs suivantes : sysDescr, sysObjectID.0, sysUpTime.0, sysContact.0, sysName.0 et sysLocation.0.
  • Enfin l’opération Set permet de modifier une valeur pour une OID donnée si celle-ci est disponible en écriture.

Par exemple voici la copie d’écran de ce que nous renvoie la commande « Get SubTree » sur le nœud OID System :

description image

Maintenant que nous avons vu un petit tour d’horizon basique de SNMP nous allons pouvoir appliquer ces quelques concepts en utilisant la bibliothèque de fonctions « OLEPRNLIB.dll ».

Pour pouvoir l’utiliser dans une macro VBA il va falloir que vous ajoutiez sa référence dans l’éditeur de macro VBA d’Excel. Allez dans le menu Outils => Références et dans la fenêtre qui apparaît recherchez la référence « oleprn 1.0 Type Library » et cochez-la :

description image

Validez sur Ok

Nous sommes maintenant prêts à utiliser la bibliothèque au sein de notre macro Excel VBA.

III Ecriture de la macro

Nous allons écrire une petite macro qui va nous permettre de récupérer dans un premier temps une valeur unique dans l’arbre MIB (opération Get), puis dans un deuxième temps toutes les clés/valeurs de l’arbre communes à chaque périphérique réseau (opération WALK).

Pour commencer, définissez une variable de type snmp :

Dim oSnmp As snmp

Il faut ensuite créer une instance de classe snmp :

Set osnmp = New snmp

Pour communiquer avec le périphérique il faut ouvrir une connexion ceci est effectué par l’intermédiaire de la fonction Open :

oSnmp.Open ipaddress, "public", 2, 100 

cette fonction prend en argument :

  • L’adresse IP de l’imprimante ;
  • La community String qui est public par défaut mais pour des raisons de sécurité devra être modifiée ;
  • Le nombre d’essais ;
  • Et le temps d’attente (TimeOut).

Une fois la connexion établie nous pouvons effectuer une opération sur l’imprimante pour récupérer des informations nous allons commencer par récupérer la valeur de l’OID « .1.3.6.1.2.1.1.1.0 » ou sysDescr.0 de l’arbre MIB. L’opération Get est associée à la fonction « Get qui prend en argument l’OID voulu et retourne la valeur correspondante :

Value = Get(OID) 

Avec OID de type String et dont la valeur est .1.3.6.1.2.1.1.1.0 

Nous pouvons par exemple écrire une petite fonction GetValue comme ceci :

Public Function GetValue(oSnmp, OID)
    GetValue = oSnmp.Get(OID)
End Function

Cette fonction prend en argument une copie de l’objet snmp que l’on a auparavant créé et l’OID en question.

L’appel de la fonction se fait donc comme ceci :

OID = ".1.3.6.1.2.1.1.1.0"
Value = GetValue(oSnmp, OID)

Nous pouvons ensuite afficher la paire clé/valeur dans notre tableau Excel comme ceci :

Set oWb = ActiveWorkbook
Set oWs = oWb.ActiveSheet
oWs.Cells.Clear
oWs.Cells(1, 1).Value = "SysDescr.0"
oWs.Cells(1, 2).Value = Value

Les choses se compliquent un peu ensuite lorsque l’on veut récupérer un ensemble de clés/valeurs dans l’arbre avec l’option Walk qui est associé à la fonction GetTree avec la bibliothèque. En effet cette fonction renvoie une structure un peu plus complexe (tableau de variant) qu’il va falloir parcourir pour énumérer chaque clé/valeur.

Nous allons dans un premier temps définir une variable qui va nous permettre de récupérer cette structure de données :

Dim TreeValues() As Variant
Ensuite il reste juste à récupérer les valeurs :
TreeValues = oSnmp.GetTree(".1.3.6.1.2.1")
Ensuite nous utilisons une boucle pour itérer chaque élément de la structure récupérée :
i = 2
 j = 1
For Each aValue In TreeValues
     oWs.Cells(i, j).Value = aValue
      If j = 2 Then
         i = i + 1
         j = 1
     Else
         j = j + 1
     End If
        
Next

Nous récupérons chaque couple clé/valeur dans la variable aValue de type Variant. Nous affichons ensuite ces valeurs dans le formulaire Excel.

Vous pourrez voir le résultat directement sur la feuille Excel. Vous aurez ainsi l’intégralité des OIDs de l’arbre. Des OIDs sont plus utiles que d’autres comme par exemple :

  • system.sysName.0 : qui permet de récupérer le hostname de votre imprimante ;
  • system.sysUpTime.0 : qui permet de récupérer le temps écoulé depuis le démarrage du périphérique réseau ;
  • interfaces.ifTable.ifEntry.ifPhysAddress.2 : qui permet de récupérer l’adresse IP du périphérique sur le réseau local ;
  • host.hrDevice.hrDeviceTable.hrDeviceEntry.hrDeviceStatus.1 : qui permet de récupérer l’état de l’imprimante.
  • host.hrDevice.hrDeviceTable.hrDeviceEntry.hrDeviceDescr.1 : qui permet de récupérer la description du périphérique (comme par exemple Photosmart 6510 B211a)
  • printmib.prtMarkerSupplies.prtMarkerSuppliesTable.prtMarkerSuppliesEntry.prtMarkerSuppliesLevel.0.1 à 4 : permet de récupurer le niveau de chaque toner de l’imprimante.
  • printmib.prtMarkerSupplies.prtMarkerSuppliesTable.prtMarkerSuppliesEntry.prtMarkerSuppliesMaxCapacity.0.1 : permet de récupérer le niveau maximal d’un toner.
  • Et bien d’autres encore

Les deux derniers OIDs sont très utiles pour calculer le pourcentage de toner restants et afficher une alerte par exemple lorsque le niveau est trop faible.

Avec ces OIDs vous devriez pouvoir récupérer les informations essentielles sur vos périphériques d’impressions par l’intermédiaire de cette bibliothèque.

Voici un exemple de script complet à modifier selon vos préférences :

Option Explicit

'Fonction permettant de récupérer une valeur correspondante à une seule OID spécifique
'utilise la fonction Get de l'objet snmp
Public Function GetValue(oSnmp, OID)
    GetValue = oSnmp.Get(OID)
End Function

'Fonction permettant de récupérer la propriété d'une OID
'utilise la fonction GetPropertyName de l'objet snmp
Public Function GetPropertyName(oSnmp, OID)
    Dim OIDString() As Variant
    Dim OIDTemp As String
    Dim i As Byte
    OIDTemp = ""
    OIDString = oSnmp.OIDFromString(OID)
    For i = 0 To UBound(OIDString)
        OIDTemp = OIDTemp + "." + Str(OIDString(i))
    Next
    GetPropertyName = OIDTemp
End Function


Public Sub PrinterConnection()
    Dim oSnmp As snmp
    Dim oWb As Workbook
    Dim oWs As Worksheet
    Dim OID As String
    Dim TreeValues() As Variant
    Dim aValue, cmpValue As Variant
    Dim PropertyName, Value As String
    Dim i, j As Byte
    
    
    'Création d''une instance de classe d'objet snmp
    Set oSnmp = New snmp
    
    'Ouverture de connection SNMP vers le périphérique en soumettant l'adresse IP, la community string, le nombre d'essais ainsi que le timeout
    oSnmp.Open "192.168.0.22", "public", 2, 100
    
    'On détermine l'OID que l'on souhaite requêter
    OID = "system.sysDescr.0"
    'On récupére la valeur correspondante en utilisant la fonction créée précédemment à cet effet
    Value = GetValue(oSnmp, OID)
    
    'On récupére le nom de la proprété correspondant à une OID spécifique
    PropertyName = GetPropertyName(oSnmp, OID)
    'On active le classeur
    Set oWb = ActiveWorkbook
    
    'On prend le focus sur la feuille de calcul en cours d'édition
    Set oWs = oWb.ActiveSheet
    
    'On supprime toutes les données qui auraient pu être affichées
    oWs.Cells.Clear
    
    'On affiche la paire OID/valeur sur la même ligne
    oWs.Cells(1, 1).Value = OID
    oWs.Cells(1, 2).Value = Value
    'Récupération de l'ensemble des paires OID/Values de l'arbre
    TreeValues = oSnmp.GetTree(".1.3.6.1.2.1")


    'oWs.Cells(2, 1).Value = TreeValues
    i = 3
    j = 1
    
    'On itère chaque paire d'OIDs/valeurs de la structure retournée
    For Each aValue In TreeValues

        'Affichage de chaque OID/value
        oWs.Cells(i, j).Value = aValue
        
        If j = 2 Then
            i = i + 1
            j = 1
        Else
            j = j + 1
        End If
        
    Next
End Sub 

IV Conclusion

Nous avons vu à travers ce tutoriel deux méthodes nous permettant de créer un template d'email à partir de données issues des cellules d’un classeur Excel.

Nous avons vu une méthode nous permettant d’interagir avec l’application Outlook de la suite bureautique Office. Et une deuxième permettant de créer et d’envoyer un mail en passant par un serveur SMTP, nous avons choisi le service Gmail dans ce tutoriel mais ces informations sont tout à fait valables pour tout autre type de serveur SMTP. Cette deuxième méthode nosu permet de nous affranchir de l'application Outlook et permet d'envoyer directement l'email sans vérification des adresses email.

blog comments powered by Disqus