WMI编程介绍及简单实际运用(一,入门)

前言陈述: 由于.net的某些特点使它脱离了操作系统底层,所以假如咱们想获得一部份底层的操作系统消息的时候较量困难,经常需求DllImport技能,这对一部份对C/C++不熟悉的程式员来说简直是唯一梦魇(对于我来说也是如此,虽然高等学院里研究过C/C++,可是我从来没有用过它们做过任何实际的实际运用程式开发),所以能经过一部份简单的办法处理的,我都绕过去了,很多时候我喜爱借助命令行来执行一部份命令,然后截取输出流,处理之后返回我需求的结果,那个也是较量痛苦的。经常来访我的博客的哥们因该对我的一篇文字作品很熟悉,或者从别的地方看到过,由于它被众多互联网转发了,这篇文字作品就《用C#获取CPU编号、硬盘编号等操作系统有关环境、属性》,网站地址是:http://blog.csdn.net/zhoufoxcn/archive/2007/03/20/1534949.aspx。
其实,还有唯一为大部份人所陌生、但功能却又十分强大的道具,它就WMI。WMI(Windows管制规范:Windows Management Instrumentation)是Microsoft基于Web的大单位管制(WBEM)的呈现,同时也是一种基于达标的操作系统管制接口。WMI最早呈目前Microsoft Windows 2000操作系统上,但它同样能够安装在Windows NT 4和Windows 9x电脑上。WMI是一种轻松获取操作系统消息的强大道具。利用它但是由于缺少WMI的介绍资源和研究资源(特别是汉文的,由于国内大部份程式员的E文水平都较量凑合,呵呵,自己也是相当凑合),所以明白WMI的不多,能运用的就少之又少了。
在WMI中有一种查询语句语言,类似于SQL语句语言,这种语句语言叫做WQL(WMI Query Language),实际上是达标SQL的唯一子集加上了WMI的扩展。在接下来的教你学课程中我会给大部份人演示一部份WQL的例子。
用js或者vbs都能够经过WMI来获取操作系统消息。下面是唯一用vbs编写的获取操作系统序列号的小程式,你能够把它复制到唯一文档文档里,然后保存为文档为.vbs的文档,然后运行:

Set SNSet = GetObject(\"winmgmts:\").InstancesOf (\"Win32_OperatingSystem\")

for each SN in SNSet

MsgBox \"当前操作系统的序列号是: \" & SN.SerialNumber

next
这是在我的机子上运行的结果:

假如经过常规手段在.net里让你写那个窍门不明白你需求多少行代码Code?需求利用几次搜索引擎?一会我将展示问号在.net里利用WMI获取操作系统序列号。
其实在.net里是支持WMI编程的,在.net类库里专门有唯一System.Management 命名空间,MSDN介绍那个命名空间如下:
“帮助对大量管制消息和管制事件集合的来访,这一部份消息和事件是与根据 Windows 管制规范 (WMI) 框架对操作系统、设备和实际运用程式设置检查测试点有关的。实际运用程式和效劳能够应用从 ManagementObjectSearcher 和 ManagementQuery 派生的类,查询感兴趣的管制消息(例如在磁盘上还剩多少可用空间、当前 CPU 利用率是多少、某一实际运用程式正连接到哪一数据库Databnse等等);或者实际运用程式和效劳能够应用 ManagementEventWatcher 类预订各种管制事件。这一部份可来访的数据能够来源分布式环境中托管的和非托管的组件。”。
System.Management 命名空间包含了下面一部份日常类:
◆ManagementObject 或 ManagementClass:分别为单个管制对象或类。 [Page]
◆ManagementObjectSearcher:用于根据指定的查询或枚举检索 ManagementObject 或 ManagementClass 对象的集合。
◆ManagementEventWatcher:用于预订来源 WMI 的事件通知。
◆ManagementQuery:用作所有查询类的基本。
在实际编程中需求留意,System.Management 命名空间中的类都存在于System.Management .dll那个文档中,所以在编程的时候一定要添加对那个dll文档的引用,如下图:

然后还需求在咱们的程式开端处添加如下代码Code:System.Management,那样咱们采用应用那个命名空间下的类来停止WMI编程。
下面我将用唯一窍门展示我刚才提到的问号在.net里获取操作系统序列号:

///
/// 获取操作系统序列号
///

///
public string GetSerialNumber()
{
string result = \"\";
ManagementClass mClass = new ManagementClass(\"Win32_OperatingSystem\");
ManagementObjectCollection moCollection = mClass.GetInstances();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"SerialNumber\"].ToString();
}
return result;
}
我想那个窍门够简单的了。
下面贴出一部份日常的窍门来获取操作系统有联系的消息,代码Code如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace WMIDemo
{
///
/// 说明:那个类很简单,主要包含唯一Main窍门
/// 作者:周公
/// 日期:2008-1-14
/// 首发地址:http://blog.csdn.net/zhoufoxcn
///

class Program
{
static void Main(string[] args)
{
GetSystemInfo getInfo = new GetSystemInfo();
Console.WriteLine(\"序列号=\"+getInfo.GetSerialNumber());
Console.WriteLine(\"CPU编号=\" + getInfo.GetCpuID());
Console.WriteLine(\"硬盘编号=\" + getInfo.GetMainHardDiskId());
Console.WriteLine(\"主板编号=\" + getInfo.GetMainBoardId());
Console.WriteLine(\"网卡编号=\" + getInfo.GetNetworkAdapterId());
Console.WriteLine(\"用户组=\" + getInfo.GetGroupName());
Console.WriteLine(\"驱动器情况=\" + getInfo.GetDriverInfo());
Console.ReadLine();
}
}
}由于是唯一命令行程式,所以有上面那个类,下面那个类才包含我要展示的代码Code:[Page]
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace WMIDemo
{
///
/// 说明:那个类主要用来展示问号利用WMI来获取一部份操作系统的消息
/// 作者:周公
/// 时候:2008-1-14
/// 首发地址:http://blog.csdn.net/zhoufoxcn
///

public class GetSystemInfo
{
///
/// 获取操作系统序列号
///

///
public string GetSerialNumber()
{
string result = \"\";
ManagementClass mClass = new ManagementClass(\"Win32_OperatingSystem\");
ManagementObjectCollection moCollection = mClass.GetInstances();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"SerialNumber\"].ToString() + \" \";
}
return result;
}
///
/// 查询CPU编号
///

///
public string GetCpuID()
{
string result = \"\";
ManagementClass mClass = new ManagementClass(\"Win32_Processor\");
ManagementObjectCollection moCollection = mClass.GetInstances();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"ProcessorId\"].ToString() + \" \";
}
return result;
}
///
/// 查询硬盘编号
///

///
public string GetMainHardDiskId()
{
string result = \"\";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"SELECT * FROM Win32_PhysicalMedia\");
ManagementObjectCollection moCollection = searcher.Get();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"SerialNumber\"].ToString() + \" \";
}
return result;
}

///
/// 主板编号
///

///
public string GetMainBoardId()
{
string result = \"\";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"root\\CIMV2\",
\"SELECT * FROM Win32_BaseBoard\");
ManagementObjectCollection moCollection = searcher.Get();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"SerialNumber\"].ToString() + \" \";
}
return result;
}

///
/// 主板编号
///

///
public string GetNetworkAdapterId()
{
string result = \"\";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL)AND (Manufacturer <> \'Microsoft\'))\");
ManagementObjectCollection moCollection = searcher.Get();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"MACAddress\"].ToString() + \" \";
}
return result;
}

///
/// 主板编号
///

///
public string GetGroupName()
{
string result = \"\";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"root\\CIMV2\", \"SELECT * FROM Win32_Group\");
ManagementObjectCollection moCollection = searcher.Get();
foreach (ManagementObject mObject in moCollection)
{
result += mObject[\"Name\"].ToString() + \" \";
}
return result;
}

///
/// 获取本地驱动器消息
///

///
public string GetDriverInfo()
{
string result = \"\";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"root\\CIMV2\", \"SELECT * FROM Win32_LogicalDisk\");
ManagementObjectCollection moCollection = searcher.Get();
foreach (ManagementObject mObject in moCollection)
{
//mObject[\"DriveType\"]共有6中估计值,分别代表如下意义:
//1:No type 2:Floppy disk 3:Hard disk
//4:Removable drive or network drive 5:CD-ROM 6:RAM disk
//本处只列出固定驱动器(硬盘分区)的情况
if (mObject[\"DriveType\"].ToString() == \"3\")
{
result += string.Format(\"Name={0},FileSystem={1},Size={2},FreeSpace={3} \", mObject[\"Name\"].ToString(),
mObject[\"FileSystem\"].ToString(), mObject[\"Size\"].ToString(), mObject[\"FreeSpace\"].ToString());
}
}
return result;
}
}
} [Page]
程式的运行结果如下(不相同机器上的结果会不相同):

最后说明:虽然绝大部份Windows操作系统已经安装了WMI(根据微软集团公司官方说法是自WinME以后的Windows操作系统包括WinME都安装了),但是别保证上面的代码Code能在所有的Windows操作系统之上,如Win95之类,假如在不支持WMI的Windows操作系统上运行WMI,那么需求从MSDN下载到本地WMI。
另外,运行WMI需求当前Windows登录用户有一定的权限,由于自己开发时是以管制员的身份登录并运行程式的,所以没有权限异常提示,但是我不保证代码Code在你处运行也正常,特别是在WebForm的环境下,由于asp.net程式默认是较低的权限运行的(安全safe理由)。
posted @ 2010-06-21 21:01  dancer  阅读(971)  评论(0编辑  收藏  举报