WMI Series :管理对象的信息查询和方法访问
生活随笔
收集整理的這篇文章主要介紹了
WMI Series :管理对象的信息查询和方法访问
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
管理對(duì)象的信息查詢(xún)和方法訪問(wèn)
?
在這一節(jié)內(nèi)容,我們將通過(guò)幾個(gè)實(shí)例來(lái)學(xué)習(xí)如何查詢(xún)管理對(duì)象信息和訪問(wèn)管理對(duì)象提供的方法,這一部分內(nèi)容將使用到我們?cè)谇懊嬷v述到的System.Management命名空間中的相關(guān)類(lèi)對(duì)象。
?
管理對(duì)象的信息查詢(xún)
管理對(duì)象的信息查詢(xún)有兩種方式,一種是直接枚舉管理對(duì)象的各種屬性,而獲取我們感興趣的數(shù)據(jù);一種方法是通過(guò)SQL查詢(xún)語(yǔ)句的方式來(lái)過(guò)濾冗余的數(shù)據(jù),而得到感興趣的數(shù)據(jù)。
對(duì)于一個(gè)Win32_LogicalDisk實(shí)例對(duì)象而言,它有那些屬性,也就是它有那些信息可以供我們?cè)L問(wèn)呢?這些屬性名是什么樣的?這是開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中經(jīng)常遇到的問(wèn)題,通常我們是可以去查MSDN,但是在這里我給出一種通過(guò)編程的方法獲取代碼。
*****************************************************
//獲取Win32_LogicalDisk WMI對(duì)象可供訪問(wèn)的屬性
public static void FetchProperties()
???? {
???? ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
???? diskClass.Get();
???? Console.WriteLine("Win32_LogicalDisk對(duì)象共有" + diskClass.Properties.Count + " 屬性。");
.??? PropertyDataCollection diskProperties = diskClass.Properties;???
???? foreach (PropertyData diskProperty in diskProperties)
???? ???? {
????????????? Console.WriteLine("diskClass[{0}]?",diskProperty.Name);
???????? }
???? }
*****************************************************
知道了那些屬性可以供我們?cè)L問(wèn),下一步就是來(lái)具體的獲取管理對(duì)象Win32_LogicalDisk的信息。首先用第一種方法,即枚舉屬性而回去數(shù)據(jù)的方法。在這里我們通過(guò)列舉WMI類(lèi)Win32_LogicalDisk實(shí)例對(duì)象的數(shù)據(jù),獲取您的計(jì)算機(jī)上各種邏輯磁盤(pán)分區(qū),包括軟驅(qū)和光驅(qū),并輸出每個(gè)邏輯磁盤(pán)分區(qū)的一些信息。
*****************************************************
//獲取Win32_LogicalDisk對(duì)象的數(shù)據(jù)信息
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)由于你的軟驅(qū)和光驅(qū)的FileSystem和Size屬性為空,所有加了if判斷,否則輸出會(huì)產(chǎn)生異常。
?????? (2)Size屬性的數(shù)據(jù)是以bytes字節(jié)為單位。
上面訪問(wèn)的方法其實(shí)很簡(jiǎn)單,我們?cè)倏纯慈绾瓮ㄟ^(guò)SQL查詢(xún)的方式來(lái)訪問(wèn)管理對(duì)象的數(shù)據(jù)。以下的例子是以win32_Process管理對(duì)象為例。
*****************************************************
//通過(guò)SQL查詢(xún)方式訪問(wèn)管理對(duì)象數(shù)據(jù)
public static void QueryInfo()
???? {
???????? ManagementObjectSearcher searcher = new
???????? ManagementObjectSearcher("select * from Win32_Process");
???? ???? foreach (ManagementObject process in searcher.Get())
????????????? {
?????????????????? Console.WriteLine("process = " + process["Name"]);
????????????? }
???? }
*****************************************************
?
至此,我們可以輕松的通過(guò)上面的方式訪問(wèn)管理對(duì)象的數(shù)據(jù)了。
?
管理對(duì)象方法的訪問(wèn)
在Windows2000的任務(wù)管理器中,我們可以終止進(jìn)程,也可以啟動(dòng)進(jìn)程;在服務(wù)管理器中,我們可以啟動(dòng)、暫停、7終止服務(wù),那么您肯定會(huì)問(wèn)通過(guò)程序怎樣完成類(lèi)似上面的任務(wù)。是的,對(duì)于那些可供用戶(hù)操作的管理對(duì)象,它提供可一些公開(kāi)的方法供客戶(hù)端應(yīng)用程序來(lái)調(diào)用,從而完成各種任務(wù)。上面的例子只是給出了單向的信息訪問(wèn),接下來(lái)的內(nèi)容,我們將看看如何訪問(wèn)管理對(duì)象的方法。
并不是所有的管理對(duì)象會(huì)公開(kāi)方法,是否公開(kāi)方法和公開(kāi)那些方法取決于需要。對(duì)于邏輯磁盤(pán)來(lái)說(shuō),可能會(huì)公開(kāi)一個(gè)Format的方法用于格式化磁盤(pán),對(duì)于運(yùn)行的進(jìn)程來(lái)說(shuō),可能公開(kāi)Start、Stop方法來(lái)開(kāi)始終止進(jìn)程。我們將以啟動(dòng)一個(gè)進(jìn)程為例來(lái)說(shuō)明這個(gè)問(wèn)題。
創(chuàng)建一個(gè)進(jìn)程,需要調(diào)用Win32_Process WMI對(duì)象的Create方法。Create方法有四個(gè)輸入?yún)?shù),分別為:
uint32 Create(
?string CommandLine,
?string CurrentDirectory,
?Win32_ProcessStartup ProcessStartupInformation,
?uint32* ProcessId
);
CommandLine參數(shù)為進(jìn)程的可執(zhí)行文件全名,如啟動(dòng)一個(gè)記事本Notepad.exe;
CurrentDirectory為被啟動(dòng)進(jìn)程的當(dāng)前工作目錄,若為Null,則子進(jìn)程和父進(jìn)程之間共享一個(gè)工作目錄;
ProcessStartupInformation:進(jìn)程啟動(dòng)的配置信息,可參考其他資料;
ProcessId:進(jìn)程的全局唯一標(biāo)識(shí)ID,當(dāng)進(jìn)程被創(chuàng)建時(shí)即被分配。
而在我們的客戶(hù)端管理應(yīng)用程序中并不是直接的調(diào)用Create方法來(lái)啟動(dòng)進(jìn)程,而是通過(guò)調(diào)用ManagementClass. InvokeMethod()方法來(lái)間接啟動(dòng)進(jìn)程的。InvokeMethod()方法有兩種原型,一種是輸入?yún)?shù)為數(shù)組,一種是輸入?yún)?shù)為ManagementBaseObject對(duì)象,為了簡(jiǎn)單起見(jiàn),我們?cè)谶@里使用的是ManagementBaseObject對(duì)象作為輸入和輸出參數(shù)。
public ManagementBaseObject InvokeMethod(string, ManagementBaseObject, InvokeMethodOptions);
InvokeMethodOptions為調(diào)用方法的選項(xiàng),包括調(diào)用延時(shí)等等。
由于WMI對(duì)象是如此之多,每個(gè)被管理的WMI對(duì)象的公開(kāi)的方法又是不同的,InvokeMethod()方法是如何能區(qū)分這些不同的WMI對(duì)象以及WMI對(duì)象不同的公開(kāi)方法,因?yàn)榉椒ǖ牟煌鸵馕哆@參數(shù)不一樣,因此我們還得知道Create這個(gè)特定的啟動(dòng)進(jìn)程方法的參數(shù)。ManagementClass. GetMethodParameters()通過(guò)在運(yùn)行時(shí)來(lái)獲取不同的方法輸入和輸出參數(shù)。
解決了這些關(guān)鍵的問(wèn)題,下面我們就可以看看代碼是怎么實(shí)現(xiàn)的。
*****************************************************
//管理對(duì)象的方法調(diào)用
public static void InvokeMethod()
???? {
???? ???? ManagementClass processClass = new ManagementClass("Win32_Process");
???????? //取得輸入?yún)?shù)
???????? ManagementBaseObject inParams = processClass.GetMethodParameters("Create");?????????????
???????? inParams["CommandLine"] = "notepad.exe";
???????? //執(zhí)行創(chuàng)建進(jìn)程
???????? ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null);
???????? //顯示創(chuàng)建進(jìn)程的結(jié)果
???????? Console.WriteLine("Creation of calculator process returned: " + outParams["returnValue"]);
???????? Console.WriteLine("Process ID: " + outParams["processId"]);
???? }
*****************************************************
看看運(yùn)行的結(jié)果,打開(kāi)了一個(gè)記事本程序,同時(shí)輸出類(lèi)似下面的信息:
Creation of calculator process returned: 0
Process ID: 2340
?
總結(jié)
以上是生活随笔為你收集整理的WMI Series :管理对象的信息查询和方法访问的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 什么是一把刀是什么歌?
- 下一篇: 贵州车票多少钱啊?