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
21 nov. 2009 à 16:05
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
20 nov. 2009 à 10:35
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 ?
19 nov. 2009 à 18:28
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 :)
18 nov. 2009 à 17:47
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 ;)
18 nov. 2009 à 17:06
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.
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.