[win32][c][dev-c++]mibread snmp lecteur de mib reseau

Soyez le premier à donner votre avis sur cette source.

Vue 10 502 fois - Téléchargée 654 fois

Description

Une utilisation simple des API fournis par Microsoft pour lire le contenu de la MIB ditante via SNMP,
(ici pour les test j'ai utilisé un serveur SNMP local installer directement via les composants windows)

Fonctionne très bien pour lister / lire la mib sur cisco/netgear et serveur snmp linux/windows.

Pour exécuter renommer le fichier "snmp-test.ex" en "snmp-test.exe" et exécuter le fichier "snmp.bat" un fichier log.txt apparait avec le résultat :p

pour les documentations :
http://msdn2.microsoft.com/en-us/library/aa378045(VS.85).aspx

pour snmp : google ^^ il y a trop de choses :p

Source / Exemple :


//------------------------------------------------------------------------------
// Projet SNMP          : lecteur mib public distant
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 22/03/2008
// Description          : programme complet
// Environnement        : compatiblité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
//------------------------------------------------------------------------------

#include <windows.h>
#include <snmp.h>
#include <Mgmtapi.h>

//libs:
/*          
-lmgmtapi
-lsnmpapi

  • /
#pragma comment(lib, "mgmtapi.lib") #pragma comment(lib, "snmpapi.lib") //docs: //http://msdn2.microsoft.com/en-us/library/aa378045(VS.85).aspx //------------------------------------------------------------------------------ //traitement complex lecture d'id jusqu'a nok //------------------------------------------------------------------------------ BOOL LireMultOid(char *id, char *resultat , LPSNMP_MGR_SESSION session) { SnmpVarBindList snmpVarList; AsnInteger errorStatus,errorIndex; char retnom[256]; unsigned int i; BOOL ret= 0; snmpVarList.list = NULL; snmpVarList.len = 0; snmpVarList.list = (SnmpVarBind *)realloc(snmpVarList.list, sizeof(SnmpVarBind) *snmpVarList.len); snmpVarList.len++; SnmpMgrStrToOid(id,&snmpVarList.list[0].name); if (SnmpMgrRequest(session,SNMP_PDU_GET,&snmpVarList,&errorStatus,&errorIndex)!=0) { if (errorStatus==SNMP_ERRORSTATUS_NOERROR) { printf("lecture OK\n"); printf("[%s]\n",id); ret = 1; SnmpUtilPrintAsnAny(&snmpVarList.list[0].value); } } //récupération des suivant jus'a terminé if (ret) { while (SnmpMgrRequest(session,SNMP_PDU_GETNEXT,&snmpVarList,&errorStatus,&errorIndex)!=0 && ret) { if (errorStatus==SNMP_ERRORSTATUS_NOERROR) { retnom[0]=0; if (snmpVarList.list[0].name.idLength) { char szBuf[256]; for (i=0;i<snmpVarList.list[0].name.idLength;i++) { strncat(retnom,itoa(snmpVarList.list[0].name.ids[i], szBuf, 10 ),256); strncat( retnom, ".",256); } strncat(retnom,"\0",256); retnom[strlen(retnom)-1]=0; } //résultat printf("[%s]\n",retnom); SnmpUtilPrintAsnAny(&snmpVarList.list[0].value); }else ret =0; } } SnmpUtilVarBindListFree(&snmpVarList); return ret; } //------------------------------------------------------------------------------ //prog principal //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { LPSNMP_MGR_SESSION session; char resultat[MAX_PATH]; //ouverture de session (ip + type: private/public) session = SnmpMgrOpen("127.0.0.1","public",1000,3); if (session!=0) { printf("Connexion OK\n"); //traitement LireMultOid(".1.3.6.1.2.1.1.1.0",resultat ,session);//id racine //fermeture SnmpMgrClose(session); }else printf("Erreur SnmpMgrOpen\n"); system("PAUSE"); return 0; }

Conclusion :


Si vous avez des questions :p n'hésitez pas :p

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

Pour l'histoire de la MIB je ne sais pas , mais je trouve sa très currieu qu'il n'existe pas de moyen de connaître la version, déjà en utilisant la méthode si dessus les versions directement compatibles sont V1 et V2 sans aucun problème V3 je n'ai jamais testé, bizzarement quand tu fais une écoute avec wireshark des trames on a bien la version du protocole qui passe.

Je n'ai pas de solution pour l'instant, sachant que la MIB est différente suivant les plateforme que tu utilise (cisco, netgear...) je ne sais pas si la véracité de tes propos est avéré.

bon weekend :)

Si je tombe sur une solution je posterais :) (si j'ai un peu de temps ) :p
Messages postés
12
Date d'inscription
jeudi 19 novembre 2009
Statut
Membre
Dernière intervention
1 décembre 2010

Bonjour,

oui exactement ca ! merci omnia ok je pense que vais jouer sur l'architecture de la base mib en faite le noeud 6 dans la base mib n'existe pas sauf dans la version snmpV2, aussi bien si on trouve le noeud 3 sous le noeud 6 ca veux dire que nous somme en face d'une base mib de snmpV3. NB: que ces deux noeud n'existeent plus dans snmpV1.
que pense tu omnia ?
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

bonsoir,

désolé de te décevoir mais ta fonction ne retourne que la version de ton système local et non la version SNMP qui est accepté au niveau de ton serveur distant . . . enfin c'est ce que j'ai compris :)
Messages postés
12
Date d'inscription
jeudi 19 novembre 2009
Statut
Membre
Dernière intervention
1 décembre 2010

bonsoir omnia :)
j ai trouvé qu on peux le récupurer a partire da la fonction :
SnmpStartup
(OUT smiLPUINT32 nMajorVersion,
OUT smiLPUINT32 nMinorVersion,
OUT smiLPUINT32 nLevel,
OUT smiLPUINT32 nTranslateMode,
OUT smiLPUINT32 nRetransmitMode);

et cé OK mé le probleme qu j utilise tout comme toi <snmp.h> par contre cette fonction se trouve dans <winsnmp.h> : il ya des soucis que cette fonction ne retourne pas des valeurs si on est dans le cas d'une imprimante reseau ou un routeur par exmeple !!! je le teste maitnant et je vais t informer avec les resultat ;)
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

Bonjour,
je n'ai pas la réponse, par contre tu peux toujours jeté un coup d'œil à la msdn :

http://msdn.microsoft.com/en-us/library/aa379001%28VS.85%29.aspx

PS : si tu as la réponse je suis intéressé :), merci de la posté ici.
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.