WMI Series :管理对象的信息查询和方法访问

来源:互联网 发布:周末做什么 知乎 编辑:程序博客网 时间:2024/04/30 06:00
管理对象的信息查询和方法访问
 
在这一节内容,我们将通过几个实例来学习如何查询管理对象信息和访问管理对象提供的方法,这一部分内容将使用到我们在前面讲述到的System.Management命名空间中的相关类对象。
 
管理对象的信息查询
管理对象的信息查询有两种方式,一种是直接枚举管理对象的各种属性,而获取我们感兴趣的数据;一种方法是通过SQL查询语句的方式来过滤冗余的数据,而得到感兴趣的数据。
对于一个Win32_LogicalDisk实例对象而言,它有那些属性,也就是它有那些信息可以供我们访问呢?这些属性名是什么样的?这是开发人员在开发过程中经常遇到的问题,通常我们是可以去查MSDN,但是在这里我给出一种通过编程的方法获取代码。
*****************************************************
//获取Win32_LogicalDisk WMI对象可供访问的属性
public static void FetchProperties()
     {
     ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
     diskClass.Get();
     Console.WriteLine("Win32_LogicalDisk对象共有" + diskClass.Properties.Count + " 属性。");
.    PropertyDataCollection diskProperties = diskClass.Properties;   
     foreach (PropertyData diskProperty in diskProperties)
          {
              Console.WriteLine("diskClass[{0}] ",diskProperty.Name);
         }
     }
*****************************************************
知道了那些属性可以供我们访问,下一步就是来具体的获取管理对象Win32_LogicalDisk的信息。首先用第一种方法,即枚举属性而回去数据的方法。在这里我们通过列举WMIWin32_LogicalDisk实例对象的数据,获取您的计算机上各种逻辑磁盘分区,包括软驱和光驱,并输出每个逻辑磁盘分区的一些信息。
*****************************************************
//获取Win32_LogicalDisk对象的数据信息
public static void FetchInfo()
     {
         ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
         ManagementObjectCollection disks = diskClass.GetInstances();
         foreach (ManagementObject disk in disks)
          {
              Console.WriteLine("Disk_DeviceID= {0}" ,disk["DeviceID"].ToString());
              Console.WriteLine("Disk_Name = {0}" , disk["Name"].ToString());
               if(disk["FileSystem"]!=null)
              Console.WriteLine("Disk_FileSystem = {0}" , disk["FileSystem"].ToString());
              Console.WriteLine("Disk_Description = {0}" , disk["Description"].ToString());
              if(disk["Size"]!=null)
              Console.WriteLine("Disk_Size ={0} " ,System.Convert.ToInt64(disk["Size"].ToString()));
              Console.WriteLine("Disk_type = {0}" , System.Convert.ToInt16(disk["DriveType"].ToString()));                   
         }
     }
*****************************************************
提示:(1)由于你的软驱和光驱的FileSystemSize属性为空,所有加了if判断,否则输出会产生异常。
       2Size属性的数据是以bytes字节为单位。
上面访问的方法其实很简单,我们再看看如何通过SQL查询的方式来访问管理对象的数据。以下的例子是以win32_Process管理对象为例。
*****************************************************
//通过SQL查询方式访问管理对象数据
public static void QueryInfo()
     {
         ManagementObjectSearcher searcher = new
         ManagementObjectSearcher("select * from Win32_Process");
          foreach (ManagementObject process in searcher.Get())
              {
                   Console.WriteLine("process = " + process["Name"]);
              }
     }
*****************************************************
 
至此,我们可以轻松的通过上面的方式访问管理对象的数据了。
 
管理对象方法的访问
Windows2000的任务管理器中,我们可以终止进程,也可以启动进程;在服务管理器中,我们可以启动、暂停、7终止服务,那么您肯定会问通过程序怎样完成类似上面的任务。是的,对于那些可供用户操作的管理对象,它提供可一些公开的方法供客户端应用程序来调用,从而完成各种任务。上面的例子只是给出了单向的信息访问,接下来的内容,我们将看看如何访问管理对象的方法。
并不是所有的管理对象会公开方法,是否公开方法和公开那些方法取决于需要。对于逻辑磁盘来说,可能会公开一个Format的方法用于格式化磁盘,对于运行的进程来说,可能公开StartStop方法来开始终止进程。我们将以启动一个进程为例来说明这个问题。
创建一个进程,需要调用Win32_Process WMI对象的Create方法。Create方法有四个输入参数,分别为:
uint32 Create(
 string CommandLine,
 string CurrentDirectory,
 Win32_ProcessStartup ProcessStartupInformation,
 uint32* ProcessId
);
CommandLine参数为进程的可执行文件全名,如启动一个记事本Notepad.exe
CurrentDirectory为被启动进程的当前工作目录,若为Null,则子进程和父进程之间共享一个工作目录;
ProcessStartupInformation:进程启动的配置信息,可参考其他资料;
ProcessId:进程的全局唯一标识ID,当进程被创建时即被分配。
而在我们的客户端管理应用程序中并不是直接的调用Create方法来启动进程,而是通过调用ManagementClass. InvokeMethod()方法来间接启动进程的。InvokeMethod()方法有两种原型,一种是输入参数为数组,一种是输入参数为ManagementBaseObject对象,为了简单起见,我们在这里使用的是ManagementBaseObject对象作为输入和输出参数。
public ManagementBaseObject InvokeMethod(string, ManagementBaseObject, InvokeMethodOptions);
InvokeMethodOptions为调用方法的选项,包括调用延时等等。
由于WMI对象是如此之多,每个被管理的WMI对象的公开的方法又是不同的,InvokeMethod()方法是如何能区分这些不同的WMI对象以及WMI对象不同的公开方法,因为方法的不同就意味这参数不一样,因此我们还得知道Create这个特定的启动进程方法的参数。ManagementClass. GetMethodParameters()通过在运行时来获取不同的方法输入和输出参数。
解决了这些关键的问题,下面我们就可以看看代码是怎么实现的。
*****************************************************
//管理对象的方法调用
public static void InvokeMethod()
     {
          ManagementClass processClass = new ManagementClass("Win32_Process");
         //取得输入参数
         ManagementBaseObject inParams = processClass.GetMethodParameters("Create");             
         inParams["CommandLine"] = "notepad.exe";
         //执行创建进程
         ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null);
         //显示创建进程的结果
         Console.WriteLine("Creation of calculator process returned: " + outParams["returnValue"]);
         Console.WriteLine("Process ID: " + outParams["processId"]);
     }
*****************************************************
看看运行的结果,打开了一个记事本程序,同时输出类似下面的信息:
Creation of calculator process returned: 0
Process ID: 2340
 
原创粉丝点击