|
WMI 的一个实现
作者:Paul Li
翻译:Abbey
原文出处:Code Project:Windows Management Instrumentation (WMI) Implementation 逆风者
源代码下载:wmi.zip(45KB)
介绍
这是我在继上一篇文章"My Explorer"之后关于Windows Management Instrumentation(Windows管理规范)的又一新作。我将向你展示一些技巧,让你可以在远程地访问网络中其他计算机的操作系统、服务、当前运行着的进程等等信息,当然前提是你必须得拥有这些计算机的管理员权限。同时我也将向你展示如何利用WMI来启动或者停止服务、终止进程、创建进程。这是程序的主界面:

开始
在这个WMI应用程序里,我创建了一个包含了四个用户控制的库WMIControlLibrary。这四个用户控制分别是Explorer,SystemInfo,Services与Processes。每个控制都有其特定的功用。以下是对每个控制作用的一个简单描述:
- Explorer控制 我把我那个"My Explorer"转换成了一个用户控制,它还是用来显示你系统上的驱动器、目录、文件等信息。
- SystemInfo 控制* 这个控制用来显示操作系统与硬件数据及清单等信息。
- Services 控制* 这个控制用来显示系统当前运行着的服务。
- Process 控制* 这个控制用来显示系统当前运行着的进程。
(*注意:这个控制可以用来监控本地或者网络上的远程系统。)
上述的每个控制都引用了System.Management命名空间,以保证它们能访问各自特定的系统信息。
控制的状态事件
这其中的一些控制需要点时间才能从系统获取相关的信息,因此我在每个控制中都实现了一个事件UpdateStatus(string e)。这样每个控制就可以更新主应用程序窗体的状态条,用户也能很清楚地知道控制正在干什么了。
//控制内部的代码
//声明一个Status的事件委托类型
public delegate void Status(string e);
//声明了一个更新状态的事件
public event Status UpdateStatus;
//更新状态条
UpdateStatus("Hello world.");
//主程序代码
//用参数中的字符串刷新状态条的显示文本
private void refreshStatusBar(string stringStatus)
{
//更新状态条
statusBarStatus.Text = stringStatus;
}
Explorer 控制

在Explorer控制内部,我使用了WMI的Win32_LogicalDisk类来访问所有本地的及网络映射的驱动器。要访问驱动器的相关信息,我得先使用一个ManagementObjectSearcher对象来获取一个包含了我所需驱动器信息的ManagementOjbectCollection对象(译注:原文用的是class,我认为不准确,因此改译为对象)。之后,我们就可以自由支配所有这些驱动器的信息。(比如驱动器名、类型、卷标、标识等等)。你也可以只查询剩余空间低于1MByte的驱动器的信息,对此只需要改变ManagementObjectSearcher参数而已:
//译注:这句就是查询剩余空间低于1MByte的SQL语句,用在ManagementObjectSearcher的构造时。
//是不是很象一般数据库编程里用的SQL语句啊?
Select * From Win32_LogicalDisk Where FreeSpace < 1000000
//取得驱动器集
ManagementObjectSearcher query = new ManagementObjectSearcher ("SELECT * From Win32_LogicalDisk ");
ManagementObjectCollection queryCollection = query.Get();
//遍历每个对象,以获取每个驱动器的信息
foreach ( ManagementObject mo in queryCollection)
{
switch (int.Parse( mo["DriveType"].ToString()))
{
case Removable: //可移动驱动器
imageIndex = 5;
selectIndex = 5;
break;
case LocalDisk: //本地驱动器
imageIndex = 6;
selectIndex = 6;
break;
case CD: //CD-ROM驱动器
imageIndex = 7;
selectIndex = 7;
break;
case Network: //网络驱动器
imageIndex = 8;
selectIndex = 8;
break;
default: //缺省:文件夹
imageIndex = 2;
selectIndex = 3;
break;
}
//获取驱动器名
Console.WriteLine("Drive: " mo["Name"].ToString());
} 本文章更多内容:1 - 2 - 3 - 4 - 5 - 6 - 下一页>> |