热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络安全管理技术作业SNMP实验报告

实验要求添加并开启WindowsSNMP代理组件;编制控制台程序,接受用户输入的OID字符串,返回在WindowsSNMP代理中的对应值;开发GUI界面程序,使用户可通过该程序

 

  1. 实验要求

     

  2. 添加并开启Windows SNMP代理组件;
  3. 编制控制台程序,接受用户输入的OID字符串,返回在Windows SNMP代理中的对应值;
  4. 开发GUI界面程序,使用户可通过该程序观察主机CPU、内存、硬盘空间、流量值;
  5. 开发阈值告警功能,用户通过界面可设置性能阈值(如CPU),当超过阈值时自动报警。

 

  1. 实验过程

 

  1. 安装并开启Windows SNMP代理组件

安装并开启Windows SNMP组件操作很简单,主要是通过"打开或关闭Windows功能"这个系统工具来完成,具体步骤因操作系统而已。以Windows 7 为例,点击开始菜单的"控制面板",在新窗口左侧选择"程序",在右侧点击"打开或关闭Windows功能",弹出如下图所示的窗口,勾选"简单网络管理协议(SNMP)",包括它的子项"WMI SNMP提供程序",点击"确定",会有几分钟的等待时间。

这样Windows SNMP 服务就已经安装好了,一般而言,这个服务也就启动了。当然,也可以通过Windows服务管理器确认一下相应服务的运行状态,并可以做必要的设置等操作。方法为,按快捷键Win + R,输入"services.msc",打开Windows 服务管理器,如下图。

滚动到SNMP Services,可以看到它的状态是已启动。在左侧窗口中可以停止或重启这个服务。

  1. 开发SnmpWatcher程序

SnmpWatcher是实现作业要求第2-4项的Windows程序。这套程序的功能本质是一个SNMP Client,对应的SNMP Sever是Windows,具体而言是前文安装和启动的SNMP Service程序。通过阅读相应的RFC文档,实现这样一个C/S模式的客户端,没有什么难度,不过却较为繁琐,好在已经有开发者提供了一套开源的SNMP库——SNMP Sharp Net,官方网站是http://www.snmpsharpnet.com/,开源项目代码托管在Sourceforge,地址是http://sourceforge.net/projects/snmpsharpnet/。SnmpWatcher就使用这个库。

    下面简单介绍一下SnmpWatcher这个程序的开发。

开发环境和工具如下表。

开发环境和工具

设备

 
 

ASUS A41IE 笔记本电脑

软件

 

操作系统

Windows 7 Ultimate with SP1, 32 bit(需要安装和开启SNMP服务)

开发工具

Microsoft Visual C# 2010 Express

网络

 
 

可以不需要

    特别说明的是,在这个实验的开发过程中访问的SNMP Server是开发环境的主机,其实也可以是有网络链接的其他主机,不过简单起见,就只用了开发主机了,所以网络可以是不需要的,在实际应用时,SNMP协议必然是运行在网络环境中的。

项目的文件目录如下图所示。现在简单说明一下主要class和namespace的设计。

  1. Program

    这个是应用程序的主类,即包含了Main方法入口。Program类保存了应用程序运行的重要数据作为自己的属性,如SNMP HOST和COMMUNITY,同时负责在启动时读取配置文件"snmpwathcer.ini",这个文件设置了HOST和COMMUNITY数据和用户界面方式命令行或图形窗口,下面是一个"snmpwatcher.ini"的标准模版。

;This is the config file for SnmpWatcher

[SnmpWatcher]

Host=localhost

Community=public

UI=window

 

  1. 工具类

    即IniFile和SnmpWatcher,IniFile是读取上文提到了"snmpwatcher.ini"配置文件的工具类,主要在Program类中使用。SnmpWatcher是对SnmpSharpNet进行简单封装的工具类,主要在Calc相关类中使用。

  2. Stat

    这个名字空间是主要提供了数据类,即对作业要求监控的CPU、内存、硬盘空间、流量值等的数据的封装,对应的类分别是CpuStat、MemoryStat、DiskStat、NetworkStat。另外一个类Stat是这些类的基类,只作为类型的约束,没有定义属性和实际意义。

    各个类的属性和含义,如下表。

数据类属性说明

CpuStat

   
 

CoreNum:uint

CPU内核数

 

Loads:List

CPU负载数列

 

LoadRate:double

CPU负载率(负载和/100)

MemoryStat

   
 

Size:uint

内存总空间

 

UsedSize:uint

内存使用空间

 

UsedRate:double

内存使用率

DiskStat

   
 

Size:uint

磁盘总空间

 

UsedSize:uint

磁盘使用空间

 

UsedRate:double

磁盘使用率

NetworkStat

   
 

InBytes:uint

流进字节数

 

OutBytes:uint

流出字节数

 

  1. Clac类

    这个名字空间这个名字空间下有1个接口和4个类,用于和Host通信,提交含有OID的SNMP请求,读取SNMP响应报文并作解析,获得系统的CPU、内存、硬盘、网络状态数据信息,存储到对应的Stat类中。

    接口是ICalc,接口定义如下。

interface ICalc where T : Stat

{

T CalcStat();

}

其余4个类实现了这个接口,四个类分别实现的功能和使用到的OID如下表所示。

Calc类

功能

使用到的OID

含义

CpuCalc

查询CPU状态数据,存储在CpuStat对象中

.1.3.6.1.2.1.25.3.3.1.2

遍历各个CPU的内核的负载

MemoryCalc

查询内存状态数据,存储在MemoryStat对象中

1.3.6.1.2.1.25.2.3.1.2

存储单元类型

1.3.6.1.2.1.25.2.3.1.4

存储单元大小

1.3.6.1.2.1.25.2.3.1.5

总存储单元数

1.3.6.1.2.1.25.2.3.1.6

使用存储单元数

1.3.6.1.2.1.25.2.1.2

内存存储单元类型码

DiskCalc

查询硬盘状态数据,存储在DiskStat对象中

1.3.6.1.2.1.25.2.3.1.2

存储单元类型

1.3.6.1.2.1.25.2.3.1.4

存储单元大小

1.3.6.1.2.1.25.2.3.1.5

总存储单元数

1.3.6.1.2.1.25.2.3.1.6

使用存储单元数

1.3.6.1.2.1.25.2.1.4

硬盘存储单元类型码

NetworkCalc

查询硬盘状态数据,存储在NetwrokStat对象中

1.3.6.1.2.1.2.2.1.6

物理地址

1.3.6.1.2.1.2.2.1.10

输入字节数

1.3.6.1.2.1.2.2.1.16

输出字节数

需要说明的是,在1.3.6.1.2.1.25.2下内存和硬盘被抽象成同一种存储设备,通过1.3.6.1.2.1.25.2.3.1.2这个值进行类别判断。这个过程相对比较复杂,具体解析过程,还是请查阅源代码。

  1. UI

    这个名字空间提供了两套用户接口,一个是命令行的(Console1),另一个是图形窗口的(Form1),另外的两个类Form1Settings是对Form1数据的抽象,主要是Form1的刷新时间和CPU、内存、磁盘的告警阈值,Form1SettingsDialog是修改阈值的窗口类,Form1Settings在Form1SettingsDialog和Form1间传递。

    Console1,实现的功能比较简单,主要是完成了作业的第2个要求,即通过输入OID查询系统状态信息,另外提供了一个命令打开图像窗口,使用演示如下图所示。

    Form1实现了作业的另两个要求,使用演示如下图。

    这个窗口显示监视主机的状态信息,可以验证和当前主机的实际信息是一致的,除了CPU会有些误差,这个误差出现的原因,我还在思考中。

    点击Settings进入设置对话框。把Memory Threshold设为50以后点OK,返回主界面,这时等待刷新,然后可以看到状态栏出现了"WARNING"的红色警告。

    

  1. 附:SnmpWatcher程序源代码

    我把SnmpWatcher的源代码放到了Bitbucket上,可以通过hg下载全部源代码,命令如下:

hg clone https://bitbucket.org/tt_0411_09/snmpwatcher

当然也可以在Bitbucket上在线查看,地址是:

https://bitbucket.org/tt_0411_09/snmpwatcher/src

 


推荐阅读
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • 在C#/ .NET中,处理基督面前的日期没有内置支持,需要编写自己的代码。本文介绍了在处理此类日期时的最佳方法,并提供了一个示例链接,可以参考编码的解决方案。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 如何在Windows窗体应用程序中实现文件加密与解密功能
    本文介绍了在Windows窗体应用程序中实现文件加密与解密功能的步骤。首先,通过新建项目选择Windows窗体应用程序,并在自动创建的From1中构建启动窗体。然后,选择要加密的文件并获取页面的密码,判断密码是否大于六位数。如果不满足条件,提示用户添加文件后缀(.mr)以表示该文件已加密,并将文件内容进行乱码处理。通过本文的方法,可以实现文件的安全加密与解密。 ... [详细]
author-avatar
流行天王MJ
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有