管理对象的信息查询和方法访问
 
在这一节内容,我们将通过几个实例来学习如何查询管理对象信息和访问管理对象提供的方法,这一部分内容将使用到我们在前面讲述到的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的信息。首先用第一种方法,即枚举属性而回去数据的方法。在这里我们通过列举WMI类Win32_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的方法用于格式化磁盘,对于运行的进程来说,可能公开Start、Stop方法来开始终止进程。我们将以启动一个进程为例来说明这个问题。
创建一个进程,需要调用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

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

  1. 旺店通WMS与旺店通WMS对接集成货主信息查询接口连通商品同步接口(WDT-WMS-TEST)

    接入系统:旺店通WMS 旺店通wms最新版是一款功能齐全的店铺管理软件.旺店通wms管理系统官方版为用户量身定做仓储规划设计,覆盖了全行业,满足了各个行业不同经营模式的仓库运营管理.旺店通wms管理系 ...

  2. WMI技术介绍和应用——查询正在运行的进程信息

    在<WMI技术介绍和应用--使用VC编写一个半同步查询WMI服务的类>一文中,我们介绍到了一个半同步查询WMI类的框架.本文将是该技术的一个应用,介绍如何使用WMI技术查询正在运行的进程信 ...

  3. WMI技术介绍和应用——查询硬件信息

    这个月实在太忙了,一直没有时间去继续写WMI的应用例子. 本来是希望将<WMI技术介绍和应用>系列博文写的像WMI百科全书般,但是貌似对这个技术感兴趣的同学并不多,所以我决定对部分知识点点 ...

  4. 网络舆情信息查询方法有哪些?具体解决方法详解

    怎么查询近期舆情信息?舆情信息的搜集方法有很多,常用的就是人工查询,也就是专人专门负责近期舆情信息的查询. 但是要知道舆情信息数据是实时在更新的且平台多样化,再加上传播形式不一.若单纯的依靠人工一个个 ...

  5. 文件10:文件路径-信息查询方法

    目录 1. p.stat(*, follow_symlinks=True) 2. p.lstat() 3. p.group() 4. p.owner() 5. p.relative_to(*other ...

  6. 查询电脑服务器信息的具体方法

    查询电脑DNS服务器信息的具体方法 方法一: 1.首先需要打开"运行"窗口.在键盘中按 WIN键+R键即可打开"运行"窗口. 2.在打开的"运行&qu ...

  7. C++通过WMI获取硬件配置信息

    C++通过WMI获取硬件配置信息 WMI即Windows管理规范.通过它可以访问.配置.管理和监视几乎所有的Windows资源. WMI提供程序在WMI和托管资源之间扮演着中间方的角色.提供程序代表使 ...

  8. 使用WMI得到计算机的信息

    使用WMI得到计算机的信息 WMI是一项行业推荐规范,旨在为访问企业环境中的管理信息而开发一种标准化技术.该信息包括系统内存的状态.当前安装的客户应用程序清单,以及有关客户端状态的其他数据. WMI是 ...

  9. WMI技术介绍和应用——查询本地用户和组

    本文使用了< WMI技术介绍和应用--使用VC编写一个半同步查询WMI服务的类>中代码做为基础.本节只是列出了WQL语句,具体使用参看前面的例子.( 转载请指明出于breaksoftwar ...

最新文章

  1. vue下的bootstrap table + jquery treegrid, treegrid无法渲染的问题
  2. 谁再说不熟悉Linux命令,就把这个给他扔过去!
  3. python使用matplotlib可视化、使用英文单次或者缩写指定使用的颜色、使用16进制的RGB字符串指定颜色、使用RGB或者RGBA数字元组指定颜色
  4. zabbix_fetion_alter
  5. 学习笔记之-MySql高级之sql优化
  6. LeetCode-best time to buy and sell stock 1 数组
  7. ajax的模式_AJAX的完整形式是什么?
  8. Waymo也商业化了!“早期乘客”项目开始测试收费,凤凰城人民掏了腰包
  9. junit4同一时候測试多个測试类
  10. 一起来当网管(一)——Windows Server上的DHCP配置
  11. jspstudy mysql_使用JspStudy集成环境快速部署jsp项目
  12. phpquery抓取网站内容简单介绍
  13. swift 首行缩进两个字符
  14. 微信小程登录功能和获取手机号
  15. 今日芯声 | 四大运营商之一居然不支持华为?假的!
  16. 惠普M1136 MFP激光打印机打印整张纸全黑
  17. 【解决方案】STM32L152单片机驱动段码LCD屏,执行HAL_LCD_Init函数失败返回HAL_TIMEOUT,长时间卡在LCD_FLAG_RDY的while循环里面的解决办法
  18. 在自己的数据集上训练CrowdDet过程记录
  19. Java后端技术框架
  20. llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

热门文章

  1. linux unset命令,Linux unset命令
  2. DL练习1:基于boston_house_prices的BP神经网络
  3. 【opencv】(3) 图像滤波:均值、方框、中值、高斯
  4. kali2020安装中文输入法(切换中文输入法)
  5. android 蓝牙 鼠标 app_Razer 雷蛇 那伽梵蛇 Pro 专业版 无线蓝牙鼠标 899元
  6. 【全网之最】全网最短代码——给名字、电话、账号、昵称加星号*添加隐私保护、身份证号加密、信息脱敏
  7. 在CentOS 6.9上从源码安装Go 1.10
  8. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
  9. 在Ubuntu 14.04 64bit上使用dig
  10. Rocksdb 的优秀代码(一) -- 工业级分桶算法实现分位数p50,p99,p9999