企业信息系统运行状态监控与管理的信息化
在企业内部运行着许多信息系统,信息系统管理员的主要工作之一就是负责这些系统的运行状态监控与管理,这也是信息系统管理员的日常工作。然而在实际工作中,系统管理员往往疏于日常监控与管理,只是在出现故障时才疲于应急维修。因此加强日常运维管理,用信息化手段提高效率和管理水平是必需的,也是IT 专业人员专业性的体现。
本文在以下部分讨论WINDOWS 环境下信息系统运行状态监控与管理的信息化实现,文中代码以SERVER2003标准版为例,在.NET2008下调试通过。
一、信息系统维护工作现状
信息系统运维最重要的是服务器软硬件及网络环境的监控与维护管理,包括同下几方面内容:
● 服务器操作系统运行状态监控(CPU 负载率、内存占用率等)
● 服务器日志监控(主要包括操作系统日志、应用程序日志、安全日志)
● 相关服务运行状态监控(数据库服务、IIS 服务、杀毒软件服务等)
● 进程监控
● 漏洞修复管理
● 网络状态监控
● 硬件状态监控
● 信息系统软硬件运行故障处理记录
● 数据库运行状态
对上述工作,常规的方式是人工检查后再填写纸质记录表。这种工作模式存在以下问题:
● 不便于追溯分析与相关性分析
信息系统出现问题,可能的原因很多。总体上是软硬件环境,但具体原因有网络、硬件故障、操作系统故障、服务配置与运行、病毒、异常进程、负载等。根据维护经验,许多故障是重新启动一下服务器就好,系统管理员往往对具体什么原因不追查或不便追查。在实际工作中,日志中经常有各种严重错误信息,但也不影响信息系统正常运行。有些原因是积累性或累加性的,如不必要的服务对信息系统安全运行的影响等,这些都要进行相关性分析。在故障处理时,相关性分析尤其重要,可以迅速定位故障、减少判定时间。
● 工作效率低、发现潜在问题难。
系统管理员日常巡检一般是登录到服务器,在系统资源管理窗口看资源使用情况、在性能窗口看系统负载、在事件窗口查看日志、在服务窗口查看相关服务运行情况、在任务管理窗口查看异常进程、PING 网关查看网络情况、查看杀毒软件服务日志、查看硬件指示灯。如有异常或故障,则处理故障后,再填写故障处理记录。
由于企业内部信息系统管理员并不是专职的系统管理员,同时用于信息系统维护的工作时间不是很多,特别是在信息系统运行正常时,往往巡查流于形式。在一个个界面切换,在短时间内从满屏信息中排查出异常迹象,效率很低,发现潜在问题的可能性极小。
● 对于全局性问题不易统一处理、根本解决问题
对于一些特定类型的故障,如病毒、漏洞引发的故障,往往是全局性的,在全厂范围内所有服务器都可能存在同样的问题。处理这类故障隐患,需要统一排查统一处理。而人工或纸质记录表方式不能支持这方式。
在信息系统正式上线运行后,才发现设计缺陷或硬件选型、软件不兼容问题也是时有发生。在上线初期,用户数据量很少,运行一段时间后随着数据量和访问量的急剧增加累积,
这些问题才可能暴露出来。对于这种故障需要配合软件程序排查,排除或确定服务器软硬件环境因素,才能确定问题最终根本解决。
● 不易开展技术积累和团队管理
因为并不是专职人员,企业内部系统管理员水平差异较大。因此基于团队管理,最理想的解决方案是分工合作,各人专攻不同的技术领域。人工方式巡查和纸质报表记录,基本上取决于各人水平和工作责任心。
一份完善的故障处理记录包括以下内容:故障现象、发生时间、处理人、故障判断思路、判断依据、故障确认方式、故障处理方法、处理结果。其中故障发生时间对于分析故障规律至关重要,根据故障时间查询故障时间点前后日志和系统环境状态可以分析出故障规律。而纸质报表是不能反映准确反映故障前的系统状态的。处理结果的跟踪反馈如果人工完成则也很费时费力。
经验来于故障处理,如果不能完整地记录故障处理所有信息,则是在浪费宝贵的经验。而团队的经验积累,是不可能靠师傅带徒弟这种传统的方式。
二、解决方案
为解决上述问题,用程序自动将信息系统状态数据写入数据库,再进行数据关联查询分析,最终实现标准化规范化的管理。这是最理想的解决方案。笔者开发了基于WMI 技术的信息系统监控与管理系统,基本实现解决了上述问题。程序用.NET2008C#开发,运行环境为WINDOWS SERVER2003标准版、SQLSERVER2008。
1、 需求分析
解决方案的核心是如何获取系统运行状态数据,这些数据分如下几类:
● 系统基础配置信息:内存、CPU 、硬盘等
● 系统实时负载信息:CPU 负载、内存使用率、磁盘队列长度、网卡吞吐率等
● 日志:应用日志、系统日志、安全日志、某些应用程序专有日志等
● 服务运行状态:服务的启动方式、当前运行状态
● 进程信息:正在运行的进程名称、系统资源占用率等
● 网络状态信息:对于服务器主要是网关、关联主机等IP 是否能PING 通
● 硬件状态:硬件报警及报错信息等
● 数据库运行信息:错误报警信息、存储空间信息、负载信息等
有了这些数据,可能通过数据关联查询,进行有效管理,需要做的也就是一个常规小型信息管理系统的功能。
获取上述信息的技术涉及到以下几种:
● WMI
Windows Management Instrumentation (WMI)是可伸缩的系统管理结构,该规范采用一个统一、基于标准且可扩展的面向对象接口。它提供与系统管理员信息和基础WMI API 交互的标准方法,主要由系统管理应用程序开发人员和系统管理员用来访问和操作系统管理信息;它可用来生成组织和管理系统信息的工具,使系统管理人员能够更密切的监视系统活动。
WMI 提供了一套内置在Microsoft Windows 操作系统中的丰富的系统管理服务,可以在有大量的应用程序、服务和设备的系统中提供全方位的管理功能。它允许应用程序的开发者,使用简单的、一致的机制,去查询企业中的任一台计算机上的信息,或是进行系统配置。通过WMI 接口可以获得的信息包括硬件设置,状态信息,驱动器配置,BIOS 信息,应用程序的设置,事件记录信息,以及其他。WMI 通过一组API 来获得信息,但它表征的是一种通过一个简单,工业标准对象管理模式来获取信息的函数。这使得应用程序的开发者不必学习Windows 的每一个API 的具体细节。
.Net FrameWork SDK对WMI 提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI 提供了一个专门的命名空间"System.Management" 。在命名空间"System.Management" 中提供了大量用以处理和WMI 相关的类、接口和枚举。
● WINDOWS 自带的性能监控
WINDOWS 自带的性能工具,可以进行对系统负载进行监控,并能设置报警将监控信息发送到MS SQL数据库或在系统日志里记录。
● POWERSHELL 脚本
POWERSHELL 相当于一个轻型C#平台,基于.NET Framework 框架,提供命令行交互式和脚本功能,实现WINDOWS 平台的资源管理。
● .NET
.Net FrameWork SDK对WMI 提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI 提供了一个专门的命名空间"System.Management" 。在命名空间"System.Management" 中提供了大量用以处理和WMI 相关的类、接口和枚举。当然作为微软最新一代开发平台,直接调用底层API 也是无所不能的。
● VBscript
与.NET 类似,VBScript 通过调用WMI 对象也能实现对WINDOWS 平台的资源管理。
2、 相关技术方案分析
由上述相关技术简述可见,最底的是WINDOWS API ,功能强大但使用复杂。WMI 和是WINDOWS 平台内置的面向系统管理员的接口规范和脚本环境,但直接用脚本编写信息管理系统太麻烦。WINDOWS 自带的性能工具使用方便,但有两点麻烦,一是只能获得系统负载信息,二是只支持写入MS SQLSERVER 数据库。POWERSHELL 功能强大,但适合于系统管理员写脚本。作为编程语言,C#比VBScript 方便很多,企业内网环境下,用C#写WINFORM 程序是最简单的。其它语言也可以实现,但C#和VBScript 是微软体系内的平台,与WINDOWS 平台与WMI 结合紧密,因此比其它语言更便捷。
综上所述,开发企业内部信息系统监控与管理系统,可行的技术方案有如下几种: ● 直接在编程环境下用API 编程
● C#或VBScript 调用POWERSHELL 脚本
● C#或VBScript 调用WMI 对象
笔者采用是的C#或VBScript 调用WMI 对象方案,是因为个人原因对C#比较熟悉。但第一种方案应更高效安全。如果熟悉POWERSHELL ,第二种方案更好。
3、 编程思路
后台数据库表结构很简单,一张主表,其它都是从表。主表记录每台服务器资产管理信息,字段为主键、管理员姓名、信息系统名、角色用途、IP 、system username、password 、资产编号、存放地点等。服务器基础信息表记录每台服务器内存、操作系统、型号、序列号、本地硬盘总容量、内存总量信息。服务器基础信息表与主表主键一对一关联,其它从表都是与主表一对多主从外键关联。日志、负载、服务、维修以及人工检查项都是单独一张表。
主程序做成服务,根据企业管理制度要求,定期启动自动抽取服务器状态数据。然后通过查询进行关联分析,同时还可以设置报警值,对异常情况进行报警。
4、 具体实现
以下代码是C#下获取磁盘容量的片段示例:
ConnectionOptions op = new ConnectionOptions();
//远程计算机用户名称
op.Username = username;
//远程计算机用户密码
op.Password = password;
//设置操作管理范围,需要知道远程服务器的IP 、用户名、口令。
ManagementScope scope = new ManagementScope("\\\\" + ip.Trim() + "\\root\\cimv2", op);
//连接远程计算机
scope.Connect();
//查询WMI 对象--取逻辑磁盘总容量
System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_LogicalDisk where DriveType=3");
ManagementObjectSearcher query = new ManagementObjectSearcher(scope, oq);
//得到WMI 返回结果
ManagementObjectCollection cq = query.Get();
//定义存放磁盘总容量的变量
Double hd=0
//获取每个磁盘容量并累加
foreach (ManagementObject mo in cq)
{
hd += Convert.ToDouble(mo.GetPropertyValue("Size")) / 1024 / 1024 / 1024;
}
代码解释
首先要在工程引用中添加System.Management ,而不是仅在声明部分添加。
ConnectionOptions 类用于指定生成 WMI 连接所需的所有设置,这里用它指定远程服务器的用户名和密码。ManagementScope 表示管理操作的范围(即命名空间),这里用它指定远程服务器的IP 和操作命名空间\\root\\cimv2,然后调用它的Connect 方法进行实际连接。、root\default
ObjectQuery 类返回查询结果,ManagementObjectSearcher 定义查询,查询结果对象放在ManagementObjectCollection 里,最后用查询结果对象的GetPropertyValue 方法取得想要的属性值。
上述过程可简化为连接、查询、取属性。查询会用到WQL ,这是WMI 对象查询的专用查询语言,相当于简化版的SQL 。查询前要知道WMI 的类和类的属性,可以用WINDOWS 自带的图形化工具wbemtest 来查看类的相关信息。以下是常用的WMI 类。
// 硬件
Win32_Processor, // CPU 处理器
Win32_PhysicalMemory, // 物理内存条
Win32_DiskDrive, // 硬盘驱动器
Win32_BaseBoard, // 主板
Win32_BIOS, // BIOS 芯片
Win32_SerialPort, // 串口
Win32_SystemSlot, // 主板插槽 (ISA & PCI & AGP)
Win32_NetworkAdapter, // 网络适配器
Win32_NetworkAdapterConfiguration, // 网络适配器设置
// 操作系统
Win32_SystemDriver, // 驱动程序
Win32_DiskPartition, // 磁盘分区
Win32_LogicalDisk, // 逻辑磁盘
Win32_LogicalDiskToPartition, // 逻辑磁盘所在分区及始末位置。
Win32_LogicalMemoryConfiguration, // 逻辑内存配置
Win32_PageFile, // 系统页文件信息
Win32_PageFileSetting, // 页文件设置
Win32_BootConfiguration, // 系统启动配置
Win32_OperatingSystem, // 操作系统信息
Win32_StartupCommand, // 系统自动启动程序
Win32_Service, // 系统安装的服务
Win32_Group, // 系统管理组
Win32_GroupUser, // 系统组帐号
Win32_UserAccount, // 用户帐号
Win32_Process, // 系统进程
Win32_Thread, // 系统线程
Win32_Share, // 共享
知道WMI 类,确定哪些属性是想要的,剩下的事就很简单了。如获取系统日志的代码如下:
oq = new System.Management.ObjectQuery("SELECT Eventcode,SourceName,TimeWritten FROM Win32_NTLogEvent WHERE Logfile = 'System' and Type='错误'");
可以获取系统日志中的所有错误日志其中的事件代码、来源、写入时间三个属性。 对于CPU 负载率,取值语句如下:
SELECT LoadPercentage FROM Win32_Processor
但仅测一个点是没有用的,应该取一段时间的平均值。
除了从WMI 取系统信息外,还作为完整的信息系统状态监控还需要监控数据库的运行状态。数据库服务的运行状态可以从WMI 中获取,如果错误报警信息、存储空间信息、负载信息等可以从直接用SQL 查询并写入数据库。本文略。
三、总结
WMI 功能强大,使用简便,可以用于定制开发系统级管理工具。本文所展示的服务器运行状态监控只是一个简单的应用。本文的重点在于企业内部运维管理,这是非常紫彩乃现实意义的。基于WMI 开发的状态监控系统,可以真正地提高信息运维水平,摆脱纸质报表那种应付上级检查的形式。
本系统在一台WINDOWS2003服务器上部署运行,监控20多台服务器,现已经过一个多月正常运行,效果良好。
企业信息系统运行状态监控与管理的信息化
在企业内部运行着许多信息系统,信息系统管理员的主要工作之一就是负责这些系统的运行状态监控与管理,这也是信息系统管理员的日常工作。然而在实际工作中,系统管理员往往疏于日常监控与管理,只是在出现故障时才疲于应急维修。因此加强日常运维管理,用信息化手段提高效率和管理水平是必需的,也是IT 专业人员专业性的体现。
本文在以下部分讨论WINDOWS 环境下信息系统运行状态监控与管理的信息化实现,文中代码以SERVER2003标准版为例,在.NET2008下调试通过。
一、信息系统维护工作现状
信息系统运维最重要的是服务器软硬件及网络环境的监控与维护管理,包括同下几方面内容:
● 服务器操作系统运行状态监控(CPU 负载率、内存占用率等)
● 服务器日志监控(主要包括操作系统日志、应用程序日志、安全日志)
● 相关服务运行状态监控(数据库服务、IIS 服务、杀毒软件服务等)
● 进程监控
● 漏洞修复管理
● 网络状态监控
● 硬件状态监控
● 信息系统软硬件运行故障处理记录
● 数据库运行状态
对上述工作,常规的方式是人工检查后再填写纸质记录表。这种工作模式存在以下问题:
● 不便于追溯分析与相关性分析
信息系统出现问题,可能的原因很多。总体上是软硬件环境,但具体原因有网络、硬件故障、操作系统故障、服务配置与运行、病毒、异常进程、负载等。根据维护经验,许多故障是重新启动一下服务器就好,系统管理员往往对具体什么原因不追查或不便追查。在实际工作中,日志中经常有各种严重错误信息,但也不影响信息系统正常运行。有些原因是积累性或累加性的,如不必要的服务对信息系统安全运行的影响等,这些都要进行相关性分析。在故障处理时,相关性分析尤其重要,可以迅速定位故障、减少判定时间。
● 工作效率低、发现潜在问题难。
系统管理员日常巡检一般是登录到服务器,在系统资源管理窗口看资源使用情况、在性能窗口看系统负载、在事件窗口查看日志、在服务窗口查看相关服务运行情况、在任务管理窗口查看异常进程、PING 网关查看网络情况、查看杀毒软件服务日志、查看硬件指示灯。如有异常或故障,则处理故障后,再填写故障处理记录。
由于企业内部信息系统管理员并不是专职的系统管理员,同时用于信息系统维护的工作时间不是很多,特别是在信息系统运行正常时,往往巡查流于形式。在一个个界面切换,在短时间内从满屏信息中排查出异常迹象,效率很低,发现潜在问题的可能性极小。
● 对于全局性问题不易统一处理、根本解决问题
对于一些特定类型的故障,如病毒、漏洞引发的故障,往往是全局性的,在全厂范围内所有服务器都可能存在同样的问题。处理这类故障隐患,需要统一排查统一处理。而人工或纸质记录表方式不能支持这方式。
在信息系统正式上线运行后,才发现设计缺陷或硬件选型、软件不兼容问题也是时有发生。在上线初期,用户数据量很少,运行一段时间后随着数据量和访问量的急剧增加累积,
这些问题才可能暴露出来。对于这种故障需要配合软件程序排查,排除或确定服务器软硬件环境因素,才能确定问题最终根本解决。
● 不易开展技术积累和团队管理
因为并不是专职人员,企业内部系统管理员水平差异较大。因此基于团队管理,最理想的解决方案是分工合作,各人专攻不同的技术领域。人工方式巡查和纸质报表记录,基本上取决于各人水平和工作责任心。
一份完善的故障处理记录包括以下内容:故障现象、发生时间、处理人、故障判断思路、判断依据、故障确认方式、故障处理方法、处理结果。其中故障发生时间对于分析故障规律至关重要,根据故障时间查询故障时间点前后日志和系统环境状态可以分析出故障规律。而纸质报表是不能反映准确反映故障前的系统状态的。处理结果的跟踪反馈如果人工完成则也很费时费力。
经验来于故障处理,如果不能完整地记录故障处理所有信息,则是在浪费宝贵的经验。而团队的经验积累,是不可能靠师傅带徒弟这种传统的方式。
二、解决方案
为解决上述问题,用程序自动将信息系统状态数据写入数据库,再进行数据关联查询分析,最终实现标准化规范化的管理。这是最理想的解决方案。笔者开发了基于WMI 技术的信息系统监控与管理系统,基本实现解决了上述问题。程序用.NET2008C#开发,运行环境为WINDOWS SERVER2003标准版、SQLSERVER2008。
1、 需求分析
解决方案的核心是如何获取系统运行状态数据,这些数据分如下几类:
● 系统基础配置信息:内存、CPU 、硬盘等
● 系统实时负载信息:CPU 负载、内存使用率、磁盘队列长度、网卡吞吐率等
● 日志:应用日志、系统日志、安全日志、某些应用程序专有日志等
● 服务运行状态:服务的启动方式、当前运行状态
● 进程信息:正在运行的进程名称、系统资源占用率等
● 网络状态信息:对于服务器主要是网关、关联主机等IP 是否能PING 通
● 硬件状态:硬件报警及报错信息等
● 数据库运行信息:错误报警信息、存储空间信息、负载信息等
有了这些数据,可能通过数据关联查询,进行有效管理,需要做的也就是一个常规小型信息管理系统的功能。
获取上述信息的技术涉及到以下几种:
● WMI
Windows Management Instrumentation (WMI)是可伸缩的系统管理结构,该规范采用一个统一、基于标准且可扩展的面向对象接口。它提供与系统管理员信息和基础WMI API 交互的标准方法,主要由系统管理应用程序开发人员和系统管理员用来访问和操作系统管理信息;它可用来生成组织和管理系统信息的工具,使系统管理人员能够更密切的监视系统活动。
WMI 提供了一套内置在Microsoft Windows 操作系统中的丰富的系统管理服务,可以在有大量的应用程序、服务和设备的系统中提供全方位的管理功能。它允许应用程序的开发者,使用简单的、一致的机制,去查询企业中的任一台计算机上的信息,或是进行系统配置。通过WMI 接口可以获得的信息包括硬件设置,状态信息,驱动器配置,BIOS 信息,应用程序的设置,事件记录信息,以及其他。WMI 通过一组API 来获得信息,但它表征的是一种通过一个简单,工业标准对象管理模式来获取信息的函数。这使得应用程序的开发者不必学习Windows 的每一个API 的具体细节。
.Net FrameWork SDK对WMI 提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI 提供了一个专门的命名空间"System.Management" 。在命名空间"System.Management" 中提供了大量用以处理和WMI 相关的类、接口和枚举。
● WINDOWS 自带的性能监控
WINDOWS 自带的性能工具,可以进行对系统负载进行监控,并能设置报警将监控信息发送到MS SQL数据库或在系统日志里记录。
● POWERSHELL 脚本
POWERSHELL 相当于一个轻型C#平台,基于.NET Framework 框架,提供命令行交互式和脚本功能,实现WINDOWS 平台的资源管理。
● .NET
.Net FrameWork SDK对WMI 提供了全面的支持,.Net FrameWork SDK为Visual C#能够操作WMI 提供了一个专门的命名空间"System.Management" 。在命名空间"System.Management" 中提供了大量用以处理和WMI 相关的类、接口和枚举。当然作为微软最新一代开发平台,直接调用底层API 也是无所不能的。
● VBscript
与.NET 类似,VBScript 通过调用WMI 对象也能实现对WINDOWS 平台的资源管理。
2、 相关技术方案分析
由上述相关技术简述可见,最底的是WINDOWS API ,功能强大但使用复杂。WMI 和是WINDOWS 平台内置的面向系统管理员的接口规范和脚本环境,但直接用脚本编写信息管理系统太麻烦。WINDOWS 自带的性能工具使用方便,但有两点麻烦,一是只能获得系统负载信息,二是只支持写入MS SQLSERVER 数据库。POWERSHELL 功能强大,但适合于系统管理员写脚本。作为编程语言,C#比VBScript 方便很多,企业内网环境下,用C#写WINFORM 程序是最简单的。其它语言也可以实现,但C#和VBScript 是微软体系内的平台,与WINDOWS 平台与WMI 结合紧密,因此比其它语言更便捷。
综上所述,开发企业内部信息系统监控与管理系统,可行的技术方案有如下几种: ● 直接在编程环境下用API 编程
● C#或VBScript 调用POWERSHELL 脚本
● C#或VBScript 调用WMI 对象
笔者采用是的C#或VBScript 调用WMI 对象方案,是因为个人原因对C#比较熟悉。但第一种方案应更高效安全。如果熟悉POWERSHELL ,第二种方案更好。
3、 编程思路
后台数据库表结构很简单,一张主表,其它都是从表。主表记录每台服务器资产管理信息,字段为主键、管理员姓名、信息系统名、角色用途、IP 、system username、password 、资产编号、存放地点等。服务器基础信息表记录每台服务器内存、操作系统、型号、序列号、本地硬盘总容量、内存总量信息。服务器基础信息表与主表主键一对一关联,其它从表都是与主表一对多主从外键关联。日志、负载、服务、维修以及人工检查项都是单独一张表。
主程序做成服务,根据企业管理制度要求,定期启动自动抽取服务器状态数据。然后通过查询进行关联分析,同时还可以设置报警值,对异常情况进行报警。
4、 具体实现
以下代码是C#下获取磁盘容量的片段示例:
ConnectionOptions op = new ConnectionOptions();
//远程计算机用户名称
op.Username = username;
//远程计算机用户密码
op.Password = password;
//设置操作管理范围,需要知道远程服务器的IP 、用户名、口令。
ManagementScope scope = new ManagementScope("\\\\" + ip.Trim() + "\\root\\cimv2", op);
//连接远程计算机
scope.Connect();
//查询WMI 对象--取逻辑磁盘总容量
System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_LogicalDisk where DriveType=3");
ManagementObjectSearcher query = new ManagementObjectSearcher(scope, oq);
//得到WMI 返回结果
ManagementObjectCollection cq = query.Get();
//定义存放磁盘总容量的变量
Double hd=0
//获取每个磁盘容量并累加
foreach (ManagementObject mo in cq)
{
hd += Convert.ToDouble(mo.GetPropertyValue("Size")) / 1024 / 1024 / 1024;
}
代码解释
首先要在工程引用中添加System.Management ,而不是仅在声明部分添加。
ConnectionOptions 类用于指定生成 WMI 连接所需的所有设置,这里用它指定远程服务器的用户名和密码。ManagementScope 表示管理操作的范围(即命名空间),这里用它指定远程服务器的IP 和操作命名空间\\root\\cimv2,然后调用它的Connect 方法进行实际连接。、root\default
ObjectQuery 类返回查询结果,ManagementObjectSearcher 定义查询,查询结果对象放在ManagementObjectCollection 里,最后用查询结果对象的GetPropertyValue 方法取得想要的属性值。
上述过程可简化为连接、查询、取属性。查询会用到WQL ,这是WMI 对象查询的专用查询语言,相当于简化版的SQL 。查询前要知道WMI 的类和类的属性,可以用WINDOWS 自带的图形化工具wbemtest 来查看类的相关信息。以下是常用的WMI 类。
// 硬件
Win32_Processor, // CPU 处理器
Win32_PhysicalMemory, // 物理内存条
Win32_DiskDrive, // 硬盘驱动器
Win32_BaseBoard, // 主板
Win32_BIOS, // BIOS 芯片
Win32_SerialPort, // 串口
Win32_SystemSlot, // 主板插槽 (ISA & PCI & AGP)
Win32_NetworkAdapter, // 网络适配器
Win32_NetworkAdapterConfiguration, // 网络适配器设置
// 操作系统
Win32_SystemDriver, // 驱动程序
Win32_DiskPartition, // 磁盘分区
Win32_LogicalDisk, // 逻辑磁盘
Win32_LogicalDiskToPartition, // 逻辑磁盘所在分区及始末位置。
Win32_LogicalMemoryConfiguration, // 逻辑内存配置
Win32_PageFile, // 系统页文件信息
Win32_PageFileSetting, // 页文件设置
Win32_BootConfiguration, // 系统启动配置
Win32_OperatingSystem, // 操作系统信息
Win32_StartupCommand, // 系统自动启动程序
Win32_Service, // 系统安装的服务
Win32_Group, // 系统管理组
Win32_GroupUser, // 系统组帐号
Win32_UserAccount, // 用户帐号
Win32_Process, // 系统进程
Win32_Thread, // 系统线程
Win32_Share, // 共享
知道WMI 类,确定哪些属性是想要的,剩下的事就很简单了。如获取系统日志的代码如下:
oq = new System.Management.ObjectQuery("SELECT Eventcode,SourceName,TimeWritten FROM Win32_NTLogEvent WHERE Logfile = 'System' and Type='错误'");
可以获取系统日志中的所有错误日志其中的事件代码、来源、写入时间三个属性。 对于CPU 负载率,取值语句如下:
SELECT LoadPercentage FROM Win32_Processor
但仅测一个点是没有用的,应该取一段时间的平均值。
除了从WMI 取系统信息外,还作为完整的信息系统状态监控还需要监控数据库的运行状态。数据库服务的运行状态可以从WMI 中获取,如果错误报警信息、存储空间信息、负载信息等可以从直接用SQL 查询并写入数据库。本文略。
三、总结
WMI 功能强大,使用简便,可以用于定制开发系统级管理工具。本文所展示的服务器运行状态监控只是一个简单的应用。本文的重点在于企业内部运维管理,这是非常紫彩乃现实意义的。基于WMI 开发的状态监控系统,可以真正地提高信息运维水平,摆脱纸质报表那种应付上级检查的形式。
本系统在一台WINDOWS2003服务器上部署运行,监控20多台服务器,现已经过一个多月正常运行,效果良好。