分享
 
 
 

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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

在这一节内容,我们将通过几个实例来学习如何查询管理对象信息和访问管理对象提供的方法,这一部分内容将使用到我们在前面讲述到的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)由于你的软驱和光驱的FileSystem和Size属性为空,所有加了if判断,否则输出会产生异常。

(2)Size属性的数据是以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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有