WMI Series 5:管理物件的資訊查詢和方法訪問 (轉)

amyz發表於2007-11-07
WMI Series 5:管理物件的資訊查詢和方法訪問 (轉)[@more@]

管理的資訊查詢和方法訪問:namespace prefix = o ns = "urn:schemas--com::office" />

在這一節內容,我們將透過幾個例項來學習如何查詢管理物件資訊和訪問管理物件提供的方法,這一部分內容將使用到我們在前面講述到的System.Management名稱空間中的相關類物件。

管理物件的資訊查詢

管理物件的資訊查詢有兩種方式,一種是直接列舉管理物件的各種屬性,而獲取我們感興趣的資料;一種方法是透過查詢語句的方式來過濾冗餘的資料,而得到感興趣的資料。

對於一個_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");

  ManagementCollection 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(" * from Win32_Process");

    foreach (ManagementObject process in searcher.Get())

  {

  Console.WriteLine("process = " + process["Name"]);

  }

  }

*****************************************************

至此,我們可以輕鬆的透過上面的方式訪問管理物件的資料了。

管理物件方法的訪問

在2000的工作管理員中,我們可以終止程式,也可以啟動程式;在服務管理器中,我們可以啟動、暫停、7終止服務,那麼您肯定會問透過怎樣完成類似上面的任務。是的,對於那些可供操作的管理物件,它提供可一些公開的方法供客戶端應用程式來,從而完成各種任務。上面的例子只是給出了單向的資訊訪問,接下來的內容,我們將看看如何訪問管理物件的方法。

並不是所有的管理物件會公開方法,是否公開方法和公開那些方法取決於需要。對於邏輯磁碟來說,可能會公開一個Format的方法用於格式化磁碟,對於執行的程式來說,可能公開Start、Stop方法來開始終止程式。我們將以啟動一個程式為例來說明這個問題。

建立一個程式,需要呼叫Win32_Process WMI物件的Create方法。Create方法有四個輸入引數,分別為:

uint32 Create(

  string ,

  string ,

  Win32_ProcessStartup ,

  uint32*

);

引數為程式的可全名,如啟動一個記事本Notepad.exe;

為被啟動程式的當前工作目錄,若為Null,則子程式和父程式之間共享一個工作目錄;

:程式啟動的資訊,可參考其他資料;

:程式的全域性唯一標識ID,當程式被建立時即被分配。

而在我們的客戶端管理應用程式中並不是直接的呼叫Create方法來啟動程式,而是透過呼叫ManagementClass. InvokeMethod()方法來間接啟動程式的。InvokeMethod()方法有兩種原型,一種是輸入引數為陣列,一種是輸入引數為ManagementBaseObject物件,為了簡單起見,我們在這裡使用的是ManagementBaseObject物件作為輸入和輸出引數。

/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemmanagementmanagementobjectclassinvokemethodtopic3.htm">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

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-981180/,如需轉載,請註明出處,否則將追究法律責任。

相關文章