【WMI】WMI For C#/dotNet 用WMI获取系统信息

来源:互联网 发布:湖北大学知行教务处 编辑:程序博客网 时间:2024/04/29 21:50
想C++/COM一样,通过C#使用dotNet一样可以进行查询和调用方法

查询的基本过程如下:
1.引用WMI的.NET类库
 在项目->引用里面添加对System.Management命名空间所在dll:System.Management.dll的引用。
2.创建ManagementObjectSearcher类的实例
ManagementObjectSearcher类用于根据指定的查询或枚举检索管理对象的集合。
3.执行查询
ManagementObjectSearcher类的Get方法用于执行查询
A同步方式:
        默认的查询方式,执行查询方法以后查询线程等待方法返回,查询方法在得到所有结果集以后才返回。这种方式适合与查询数据量不大,查询时间很短的情况。
       同步情况下,返回一个 ManagementObjectCollection,它包含匹配指定查询的对象。
ManagementObjectCollection result = search.Get();
foreach (ManagementObject info in result)
{
         Console.WriteLine(
"Name:  {0}", info["name"])
}
B异步方式:
        异步查询需要在执行查询方法的时候,需要传入类型为ManagementOperationObserver的参数。查询到对象后由ManagementOperationObserver对象的ObjectReady事件通知,查询得到的对象在ObjectReady事件参数的NewObject属性中。
        异步情况下,每查询到一个对象,触发一次ManagementOperationObserver类的ObjectReady事件,我们在事件处理过程中获取对象的值。
ManagementOperationObserver results = new
            ManagementOperationObserver();
        
// 连接事件处理程序
results.ObjectReady += new 
            ObjectReadyEventHandler(
this.NewObject);
results.Completed 
+= new 
            CompletedEventHandler(
this.Done);

searcher.Get(results);
//事件处理过程:
private void NewObject(object sender,
ObjectReadyEventArgs obj) 
{
    Console.WriteLine(
"Name:  {0}", info["name"])
}
    
private void Done(object sender,
    CompletedEventArgs obj) 
{
     isCompleted 
= true;
}
4.处理结果
        同步查询方式下,枚举ManagementObjectCollection对象里面的元素,即可获得匹配对象;异步方式下, 通过ObjectReadyEventArgs对象的NewObject属性取出匹配对象。

调用方法的基本过程如下:
1.取得Provider类或者它的实例对象
ManagementClass processClass = new ManagementClass("Win32_Process");
        这行代码结果是取得了Win32_Process的类,但没有生成它的实例。通过它,只能调用Win32_Process的静态方法。
ManagementObject classInstance = 
                    
new ManagementObject("root/CIMV2"
                    
"Win32_Service.Name='PlugPlay'",
                    
null);
        这行代码取得了Win32_Service类的一个实例,通过它,可以调用Win32_Service的静态方法和实例方法。
2.生成Provider提供方法的参数的对象
        提供一个object数组,或者ManagementBaseObject类型的对象,里面存储调用函数的参数,然后将object数组或ManagementBaseObject类型的对象传给执行provider方法的函数。
3.调用方法
        调用ManagementClass或ManagementObject的InvokeMethod()方法,执行provider的方法。
原创粉丝点击