65.9K
CodeProject 正在变化。 阅读更多。
Home

思科配置下载和上传 - 第二部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.14/5 (21投票s)

2002年12月31日

14分钟阅读

viewsIcon

109786

思科配置下载与上传的第二部分。本节将简要介绍win SNMP API。

引言

有一天,我想知道我公司路由器有哪些配置。因为我在一家银行工作,有很多分支机构,很多路由器,当然也有很多配置。所以我想访问路由器,并请求我在安卡拉的一位朋友给我发送路由器上安装的配置文件。最后(很多天后),他发给我一个。我看了一下文件,发现他删除了所有enable password部分、虚拟终端访问部分、auxiliary port访问部分和console访问部分。但有一个后门,即snmp读/写 community name。是的,我有一个后门,但我没有任何snmp工具来获取路由器的配置文件。我找到了一个很棒的工具,名为“Solar Winds Engineers Edition”。30天后,试用期结束了。然后我一次又一次地在网上搜索。最后,我厌倦了,决定编写自己的程序来实现我的目标。这次我搜索了snmp协议的资料,找到一些文档后,我编写了这个程序。在本节中,我将提供一些关于SNMP协议的简要信息(如果您想了解更多,可以访问思科网站 - www.cisco.com),wsnmp32 API函数声明及其用法。最后一节将包含程序的源代码。我希望这些内容至少能对网上的一个人有所帮助。

什么是SNMP?

SNMP(简单网络管理协议)是一种协议,它使得网络设备之间能够交换管理信息。它还可以管理网络性能、发现和解决网络问题以及规划网络增长。SNMP有三个版本,分别是SNMP V.1、SNMP V.2和SNMP V.3。每个SNMP版本都在前一个版本的基础上引入了新功能。SNMP有三个基本组成部分:托管设备、代理和网络管理系统(NMS)。托管设备是包含代理并位于托管网络上的网络节点。它们可以是路由器、接入服务器、交换机、桥接器、集线器、计算机主机或打印机。代理是驻留在托管设备中的网络管理软件模块。NMS包含监控和控制托管设备的应用程序。

什么是Win SNMP?

Win SNMP是一个API,它使在Microsoft Windows操作系统下运行的基于SNMP的网络管理应用程序能够使用SNMP的功能。它包含许多用于获取SNMP代理信息和设置新值的函数。在这里,您将找到SNMP V.1和SNMP V.2中定义的所有结构和常量定义、函数声明及其用法。

SNMP数据类型和结构

SNMP数据类型和结构如下:

数据类型
类型名称C# 类型
smiINTint
smiINT32int
smiUINT32uint
smiOCTETSsmiOCTET结构
smiBITSsmiOCTET结构
smiOIDsmiOCTET结构
smiIPADDRsmiOCTET结构
smiCNTR32uint
smiGAUGE32uint
smiTIMETICKSuint
smiOPAQUEsmiOCTET结构
smiNSAPADDRsmiOCTET结构
smiCNTR64SsmiCNTR64结构

结构

smiOCTET
类型名称C# 类型
smiUINT32 lenuint len
smiUINT32 ptruint ptr
C#结构定义
struct smiOCTET
{
   uint len;
   uint ptr;
}
smiCNTR64
类型名称C# 类型
smiUINT32 hipartuint hipart
smiUINT32 lopartuint lopart
C#结构定义
struct smiCNTR64
{
   uint hipart;
   uint lopart;
}

本地数据库函数

本地数据库函数如下:

SnmpSetTranslateMode

定义
Win SNMPC#
SnmpSetTranslateMode( IN smiUINT32 nTranslateMode);[DllImport("wsnmp32")] extern int SnmpSetTranslateMode( int nTransMode);
描述
SnmpSetTranslateMode函数使调用应用程序能够告知实现者,在后续的SnmpStrToEntitySnmpStrToContext函数调用中使用所需的实体/上下文翻译模式。nTranslateMode是要设置的所需模式,并且必须是以下值之一:

SNMPAPI_TRANSLATED
SNMPAPI_UNTRANSLATED_V1
SNMPAPI_UNTRANSLATED_V2

SnmpSetRetransmitMode

定义
Win SNMPC#
SnmpSetRetransmitMode( IN smiUINT32 nRetransmitMode);[DllImport("wsnmp32")] extern int SnmpSetRetransmitMode(int nRetransmitMode);
描述
SnmpSetRetransmitMode函数使调用应用程序能够告知实现者,在后续的SnmpSendMsg操作中所需的重传模式(即超时/重试)。nRetransmitMode是要设置的所需模式,并且必须是以下值之一:

SNMPAPI_ON-> 实现正在进行重传
SNMPAPI_OFF-> 实现不进行重传

通信函数

通信函数如下:

SnmpStartup

定义
Win SNMPC#
SnmpStartup(OUT smiUINT32 nVerMaj, OUT smiUINT32 nVerMin, OUT smiUINT32 nLevel, OUT smiUINT32 nTMode, OUT smiUINT32 nRMode);[DllImport("wsnmp32")] extern int SnmpStartup(ref int nVerMaj, ref int nVerMin, ref int nLevel, ref int nTMode, ref int nRMode);
描述
SnmpStartup函数通知实现者,调用应用程序将使用其服务,从而使实现者能够执行任何必需的启动过程和分配,并向应用程序返回一些有用的维护信息。

nMajorVersion-> 是接收主版本号的变量
nMinorVersion-> 是接收次版本号的变量
nLevel-> 是接收支持的最高级别的变量
nTranslateMode-> 是接收生效的默认实体/上下文翻译模式的变量
nRetransmitMode-> 是接收生效的默认重传模式的变量

注意:每个Win SNMP应用程序在调用任何其他Win SNMP函数之前都必须调用此函数。

SnmpCleanup();

定义
Win SNMPC#
SnmpCleanup();[DllImport("wsnmp32")] extern int SnmpCleanup();
描述
SnmpCleanup函数通知实现者,调用应用程序正在断开连接,并且不再需要实现者可能为其分配的任何开放资源。实现者将释放分配给应用程序的所有资源,除非它们也被分配给其他活动应用程序。重要提示:每个应用程序在退出应用程序之前,都必须在每次调用SnmpOpen函数后调用SnmpFreeXXX函数和SnmpClose函数。在紧急退出时,实现者仅释放其自身负责的资源,如果调用此函数的话。

SnmpClose

定义
Win SNMPC#
SnmpClose(IN smiUINT32 hSession);[DllImport("wsnmp32")] extern int SnmpClose(int hSession);
描述
SnmpClose函数指示实现者代表调用应用程序释放和/或关闭与指定会话关联的内存、资源、通信机制和数据结构。一个行为良好的应用程序将在不再需要会话后调用SnmpClose。在紧急退出时,至少必须调用SnmpCleanup。一个行为良好的应用程序将在每个打开的会话不再需要时调用SnmpClose。在紧急退出时,至少必须调用SnmpCleanup。

SnmpSendMsg

定义
Win SNMPC#
SnmpSendMsg(IN smiUINT32 hSession, IN smiUINT32 sEntity, IN smiUINT32 dEntity, IN smiUINT32 hContext, IN smiUINT32 hPDU);[DllImport("wsnmp32")] extern int SnmpSendMsg(int hSession, int sEntity, int dEntity, int hContext, int hPDU);
描述
SnmpSendMsg函数请求将指定的PDU传输到目标实体,使用指定的上下文以及(对于SNMPv2通信)指定的源实体。
当WinSNMP实现通过SnmpSendMsg函数收到传输请求时,它将根据自身的处理能力以及请求会话和持有上下文的远程实体相关的属性,以及本地数据库中的值,来确定使用哪种SNMP版本和哪种传输方式。

session-> 标识将执行操作的会话。
srcEntity-> 标识主题管理实体。
dstEntity-> 标识目标管理实体。
context-> 标识感兴趣的目标上下文。
pdu-> 标识包含操作的SNMP协议数据单元。

注意:WinSNMP实现负责验证PDU结构(和其他参数)的正确性。

SnmpRecvMsg

定义
Win SNMPC#
SnmpRecvMsg(IN smiUINT32 hSession, OUT smiUINT32 sEntity, OUT smiUINT32 dEntity, OUT smiUINT32 hContext, OUT smiUINT32 hPDU);[DllImport("wsnmp32")] extern int SnmpRecvMsg(int hSession, ref int sEntity, ref int dEntity, ref int hContext, ref int hPDU);
描述
SnmpRecvMsg函数检索给定HSNMP_SESSION上已完成的异步请求的结果。它还接收为该会话注册的陷阱。

session-> 指定将接收SNMP消息的会话。
sEntity-> 标识发送消息的实体(代理角色)。
dEntity-> 标识将接收消息的实体(管理器角色)。
hcontext-> 标识srcEntity发出消息的上下文。
hpdu-> 标识接收消息的PDU组件。

注意:由于可能发送多个消息给代理,接收顺序可能与发送顺序不同。因此,Win SNMP应用程序有责任通过发送的消息的请求ID来检查请求ID,以确保接收到的消息是对已发送消息的响应。

SnmpOpen

定义
Win SNMPC#
SnmpOpen(IN smiUINT32 hWnd, IN smiUINT32 wMsg);[DllImport("wsnmp32")] extern int SnmpOpen(IntPtr hWnd, int wMsg);
描述
SnmpOpen函数使实现者能够为应用程序分配和初始化内存、资源和/或通信机制和数据结构。应用程序将继续使用实现者返回的“会话标识符”在后续的WinSNMP函数调用中,以便按会话进行资源核算。此机制使实现者能够响应给定会话的后续SnmpClose函数调用,有序地释放资源。

hWnd-> 标识应用程序的通知窗口。
wMsg-> 标识应用程序的通知消息。

实体/上下文函数

实体/上下文函数如下:

SnmpStrToEntity

定义
Win SNMPC#
SnmpStrToEntity(IN smiUINT32 hSession, IN LPCSTR Entity);[DllImport("wsnmp32")] extern int SnmpStrToEntity(int hSession, string Entity);
描述
SnmpStrToEntity函数接受一个指向标识感兴趣实体的null终止文本字符串的指针,如果成功,则返回一个指向实体信息的实现特定表示的句柄。请注意,生成的实体句柄可以用作srcEntity值或dstEntity值。

hsession-> 分配会话的句柄。
实体-> 指向一个NULL终止的文本字符串,该字符串标识感兴趣的管理实体。

SnmpFreeEntity

定义
Win SNMPC#
SnmpFreeEntity(IN smiUINT32 hEntity);[DllImport("wsnmp32")] extern int SnmpFreeEntity(int hEntity);
描述
SnmpFreeEntity函数释放与SnmpStrToEntity函数返回的实体相关的资源。

hEntity-> 要释放的实体句柄。

SnmpStrToContext

定义
Win SNMPC#
SnmpStrToContext(IN smiUINT32 hSession, OUT smiOCTET smiOctets);[DllImport("wsnmp32")] extern int SnmpStrToContext(int hSession, ref smiOCTETSTRING smiOctets);
描述
SnmpStrToContext函数接受一个OCTET STRING,该字符串命名感兴趣的托管对象集合(或“配置文件”)(对于SNMPAPI_TRANSLATED模式),一个community string(对于SNMPAPI_UNTRANSLATED_V1模式),或一个contextID(对于SNMPAPI_UNTRANSLATED_V2模式),并返回一个指向上下文信息的实现特定表示的句柄,供SnmpSendMsg和SnmpRegister函数使用。

session-> 分配会话的句柄。
smiOctets-> 指向一个smiOCTETS描述符,该描述符标识托管对象、community string或contextID的集合。

SnmpFreeContext

定义
Win SNMPC#
SnmpFreeContext(IN smiUINT32 hContext);[DllImport("wsnmp32")] extern int SnmpFreeContext(int hContext);
描述
SnmpFreeContext函数释放与SnmpStrToContext函数返回的上下文相关的资源。

hContext-> 要释放的上下文句柄。

PDU函数

PDU函数如下:

SnmpCreatePdu

定义
Win SNMPC#
SnmpCreatePdu(IN smiUINT32 hSession, IN smiINT32 typePDU, IN smiINT32 ReqID, IN smiINT32 errorStat, IN smiINT32 errorIdx, IN smiUINT32 hVBL);[DllImport("wsnmp32")] extern int SnmpCreatePdu(int hSession, int typePDU, int ReqID, int errorStat, int errorIdx, int hVBL);
描述
SnmpCreatePdu函数为后续在SnmpSendMsg、SnmpEncodeMsg和其他函数中使用分配和初始化SNMP协议数据单元。

hSession-> 分配会话的句柄。
typePDU-> NULL或PDU函数部分介绍中所示的PDU_types表中的值之一。如果为NULL,WinSNMP实现将提供SNMP_PDU_GETNEXT。
ReqID-> 应用程序提供的用于标识PDU的值,或者为NULL,在这种情况下,WinSNMP实现将提供一个值。
errorStat-> 对于除SNMP_PDU_GETBULK以外的所有PDU类型,输入时被忽略(且可以为NULL),在这种情况下,它表示non_repeaters的值。对于所有其他PDU类型,WinSNMP实现将提供SNMP_ERROR_NOERROR。
errorIdx-> 对于除SNMP_PDU_GETBULK以外的所有PDU类型,输入时被忽略(且可以为NULL),在这种情况下,它表示max_repetitions的值。WinSNMP实现为所有其他PDU类型返回0(零)。
hVBL-> 变量绑定列表数据结构的句柄(或NULL)。

SnmpGetPduData

定义
Win SNMPC#
SnmpGetPduData(IN smiUINT32 hPDU, OUT smiUINT32 typePDU, OUT smiUINT32 ReqID, OUT smiUINT32 errorStat, OUT smiUINT32 errorIdx, OUT smiUINT32 hVBL);[DllImport("wsnmp32")] extern int SnmpGetPduData(int hPDU, ref int typePDU, ref int ReqID, ref int errorStat, ref int errorIdx, ref int hVBL);
描述
SnmpGetPduData函数从指定的PDU中提取选定的数据元素,并将它们复制到指定的相应输出参数位置。

hPDU-> 标识SNMP协议数据单元。
typePDU-> 如果不为NULL,则指向一个smiINT变量,该变量将接收PDU的PDU_type。
ReqID-> 如果不为NULL,则指向一个smiINT32变量,该变量将接收PDU的request_id。
errorStat-> 如果不为NULL,则指向一个smiINT变量,该变量将接收PDU的error_status(或non_repeaters)。
errorIdx-> 如果不为NULL,则指向一个smiINT变量,该变量将接收PDU的error_index(或max_repetitions)。
hVBL-> 如果不为NULL,则指向一个HSNMP_VBL变量,该变量将接收PDU的变量绑定列表句柄。

SnmpFreePdu

定义
Win SNMPC#
SnmpFreePdu(IN smiUINT32 hPDU);[DllImport("wsnmp32")] extern int SnmpFreePdu(int hPDU);
描述
SnmpFreePdu函数释放与之前由SnmpCreatePdu或SnmpDuplicatePdu函数创建的协议数据单元相关的资源。

hPDU-> 标识要释放的SNMP协议数据单元。

变量绑定函数

变量绑定函数如下:

SnmpCreateVbl

定义
Win SNMPC#
SnmpCreateVbl(IN smiUINT32 hSession, IN smiOID VarOID, IN smiVALUE VarVal);[DllImport("wsnmp32")] extern int SnmpCreateVbl(int hSession, ref smiOID VarOID, ref smiVALUEINT VarVal);
描述
SnmpCreateVbl函数为调用应用程序创建一个新的变量绑定列表结构。如果“名称”和“值”参数不为NULL,SnmpCreateVbl将使用它们来构造变量绑定列表的初始变量成员。

hSession-> 分配会话的句柄。
VarOID-> 如果不为NULL,则指向用于初始化变量绑定列表的OID。
VarVal-> 如果不为NULL,则指向用于初始化变量绑定列表的值。

SnmpFreeVbl

定义
Win SNMPC#
SnmpFreeVbl(IN smiUINT32 hVBL);[DllImport("wsnmp32")] extern int SnmpFreeVbl(int hVBL);
描述
SnmpFreeVbl函数释放与之前由SnmpCreateVbl或SnmpDuplicateVbl分配的变量绑定列表结构相关的资源。WinSNMP应用程序负责释放通过调用SnmpCreateVbl和SnmpDuplicateVbl分配的变量绑定列表资源。

hVBL-> 标识要释放的变量绑定列表。

SnmpGetVb

定义
Win SNMPC#
SnmpGetVb(IN smiUINT32 hVBL, IN smiUINT32 Index, OUT smiOID VarOID, OUT smiVALUE VarVal);[DllImport("wsnmp32")] extern int SnmpGetVb(int hVBL, int Index, ref smiOID VarOID, ref smiVALUEOCTET VarVal);
描述
SnmpGetVb函数从由Index参数标识的变量绑定中检索对象实例名及其关联的值。SnmpGetVb函数将对象实例名返回到由name参数指向的描述符中,并将其关联的值返回到由value参数指向的描述符中。

hVBL-> 标识主题变量绑定列表。
目录-> 标识变量绑定列表中文本变量绑定的位置。
VarOID-> 指向一个变量,用于接收变量绑定的OID部分。
VarVal-> 指向一个变量,用于接收变量绑定的值部分。

实用绑定函数

实用绑定函数如下:

SnmpGetLastError

定义
Win SNMPC#
SnmpGetLastError(IN smiUINT32 hSession);[DllImport("wsnmp32")] extern int SnmpGetLastError(int hSession);
描述
SnmpGetLastError函数返回一个指示应用程序执行的最后一个WinSNMP操作失败原因的信息。

hSession-> 指示请求错误信息的会话。如果为NULL,则返回应用程序范围的错误信息。

SnmpStrToOid

定义
Win SNMPC#
SnmpStrToOid(IN LPCSTR strOID, OUT smiOID dstOID);[DllImport("wsnmp32")] extern int SnmpStrToOid(string strOID, ref smiOID dstOID);
描述
SnmpStrToOid函数将点分数字形式的OBJECT IDENTIFIER的文本表示形式转换为内部OBJECT IDENTIFIER表示形式。

strOID-> 指向一个将要转换的NULL终止字符串。
dstOID-> 指向一个smiOID变量,用于接收转换后的值。

SnmpFreeDescOid

定义
Win SNMPC#
SnmpFreeDescOid(IN smiUINT32 syntax,OUT smiOID Descriptor);[DllImport("wsnmp32", EntryPoint="SnmpFreeDescriptor")] extern int SnmpFreeDescOid(int syntax,ref smiOID Descriptor);
描述
SnmpFreeDescriptor函数用于应用程序通知实现者,它不再需要访问之前由实现者填充的WinSNMP“描述符对象”。

syntax-> 标识目标描述符的“语法”(数据类型)。
描述符-> 标识目标描述符对象。

内核函数

代码中使用的内核函数如下:


[DllImport("kernel32")] public static extern void
   Sleep(int dwMilliseconds);


[DllImport("kernel32")] public static extern int
   GetTickCount();


[DllImport("Kernel32", EntryPoint="RtlMoveMemory")] unsafe public static extern int
   CopyMemoryInt(int dest, int src, int length);

关于下一节

本文的下一节将介绍程序的源代码。由于代码行数很多,文章中不会展示所有代码。但会展示SnmpSend和SnmpReceive函数、SnmpGet、SnmpGetNext函数的基本流程。下一节再见。

© . All rights reserved.