前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >WMI Series :管理对象的信息查询和方法访问

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

作者头像
Java架构师必看
发布2021-03-22 11:16:12
发布2021-03-22 11:16:12
54300
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

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

在这一节内容,我们将通过几个实例来学习如何查询管理对象信息和访问管理对象提供的方法,这一部分内容将使用到我们在前面讲述到的 System.Management 命名空间中的相关类对象。

管理对象的信息查询

管理对象的信息查询有两种方式,一种是直接枚举管理对象的各种属性,而获取我们感兴趣的数据;一种方法是通过 SQL 查询语句的方式来过滤冗余的数据,而得到感兴趣的数据。

对于一个 Win32_LogicalDisk 实例对象而言,它有那些属性,也就是它有那些信息可以供我们访问呢?这些属性名是什么样的?这是开发人员在开发过程中经常遇到的问题,通常我们是可以去查 MSDN ,但是在这里我给出一种通过编程的方法获取代码。

代码语言:javascript
代码运行次数:0
复制
 *****************************************************
 //获取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 的信息。首先用第一种方法,即枚举属性而回去数据的方法。在这里我们通过列举 WMI 类 Win32_LogicalDisk 实例对象的数据,获取您的计算机上各种逻辑磁盘分区,包括软驱和光驱,并输出每个逻辑磁盘分区的一些信息。

代码语言:javascript
代码运行次数:0
复制
 *****************************************************
 //获取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 )由于你的软驱和光驱的 FileSystem Size 属性为空,所有加了 if 判断,否则输出会产生异常。

2 Size 属性的数据是以 bytes 字节为单位。

上面访问的方法其实很简单,我们再看看如何通过 SQL 查询的方式来访问管理对象的数据。以下的例子是以 win32_Process管理对象为例。

代码语言:javascript
代码运行次数:0
复制
 *****************************************************
 //通过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 的方法用于格式化磁盘,对于运行的进程来说,可能公开 Start 、 Stop 方法来开始终止进程。我们将以启动一个进程为例来说明这个问题。

创建一个进程,需要调用 Win32_Process WMI对象的Create方法。Create方法有四个输入参数,分别为:

代码语言:javascript
代码运行次数:0
复制
 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()通过在运行时来获取不同的方法输入和输出参数。

解决了这些关键的问题,下面我们就可以看看代码是怎么实现的。

代码语言:javascript
代码运行次数:0
复制
 *****************************************************
 //管理对象的方法调用
 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

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档