概述
不知道大家有没有这种体会?有时候为了获取系统一点点信息比如考虑一下操作系统的版本号或者当前屏幕的分辨率其实说到底就是读操作系统某个方面的一个属性值而已然后就看到我们的程序中密密麻麻的Win API申明调用代码的可读性和维护性不言而喻到了NET微软提供了更为丰富的类有很多以前要调用API的方法可以在NET中轻而易举的调用实现今天简单介绍一个在NET中如何通过与WMI(Windows 管理规范)的通讯从而得到获取信息的目的
主要思路
举一个获取操作系统共享目录和获取主板号的例子介绍如何利用SystemManagment下面的类获取系统相关的信息
正文
WMI(Windows管理规范Windows Management Instrumentation)是Microsoft基于Web的企业管理(WBEM)的实现同时也是一种基于标准的系统管理接口WMI最早出现在Microsoft Windows 系统上但它同样可以安装在Windows NT 和Windows x计算机上WMI是一种轻松获取系统信息的强大工具
在NET中有一个SystemManagement名空间(系统默认没有引用我们可以手动添加引用)通过下面的Class的操作可以查询系统软硬件的信息先看一个简单的例子
Imports SystemManagement
Dim searcher As New ManagementObjectSearcher(SELECT * FROM Win_share)
Dim share As ManagementObject
For Each share In searcherGet()
MessageBoxShow(shareGetText(TextFormatMof))
Next share
运行的结果是列出了所有系统当前共享的目录以及描述等等
分析一下上面的代码可以看到一下几点
似乎是在进行数据库操作有点像SQL语句其实就是SQL操作这种语句被成WQL(WMI Query Language)实际上是标准SQL的一个子集加上了WMI的扩展
WQL是个只读的查询语言我们只能查询响应的数据不能用UPDATEINSERT等更新操作
代码很简单通俗易懂
我们采用了一种MOF(托管对象格式)的显示
例子二获取当前主板的信息
上面的例子是一个软件方面的信息下面看一个获取硬件信息的例子获取主板的序列号以及制造商
Dim searcher As New ManagementObjectSearcher(SELECT * FROM Win_BaseBoard)
Dim share As ManagementObject
For Each share In searcherGet()
DebugWriteLine(主板制造商: & share(Manufacturer))
DebugWriteLine(型号: & share(Product))
DebugWriteLine(序列号: & share(SerialNumber))
Next share
总结以及补充
WMI类也是分层次的具体可以参考msdn中的WMI转向NET平台开发的时候最好能多看一些关于NET新特性的介绍这样可以大幅度的提升代码的开发效率以及运行效率