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
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.