利用WMI獲取系統信息 WMI(Windows Management Instrumentation)技術是微軟提供的Windows下的系統管理工具。通過該工具可以在本地或者管理客戶端系統中幾乎一切的信息。很多專業的網路管理工具都是基於WMI開發的。該工具在Win2000以及WinNT下是標準工具,在Win9X下是擴展安裝選項。本文將介紹如何通過VB編程來訪問WMI對象的編程。 首先來看一個簡單的通過WMI獲取系統信息的範例,這個範例通過WMI對象獲得系統中運行的的進程:Function Enum1() As String Dim WMI Set WMI = GetObject("WinMgmts:") Set objs = WMI.InstancesOf("Win32_Process") For Each obj In objs Enum1 = Enum1 + obj.Description + Chr(13) + Chr(10) NextEnd Function 在上面的代碼中,首先通過 GetObject("WinMgmts:")獲得WMI對象,在WMI對象下有很多的子項,在這裡我們通過WMI.InstancesOf("Win32_Process")獲得系統中所有的進程列表子項。 下面看一個完整的訪問WMI對象的範例,這個範例獲得計算機的信息。 建立一個新工程,在Form1中添加一個TextBox控制項以及一個CommandButton控制項,在CommandButton的Click事件中寫入以下的代碼:Private Sub Command1_Click() Dim s, System, item Dim i As Integer Set System = GetObject("winmgmts:").InstancesOf("Win32_ComputerSystem") For Each item In System 『List1.AddItem item.cputype s = "Computer Info" & vbCrLf s = s & "***********************" & vbCrLf s = s & "計算機名稱: " & item.name & vbCrLf s = s & "狀態: " & item.Status & vbCrLf s = s & "類型: " & item.SystemType & vbCrLf s = s & "生產廠家: " & item.Manufacturer & vbCrLf s = s & "型號: " & item.Model & vbCrLf s = s & "內存: ~" & item.totalPhysicalMemory 1024000 & "mb" & vbCrLf s = s & "域: " & item.domain & vbCrLf 『s = s & "工作組" & item.Workgroup & vbCrLf 『獲得工作組和域的選項不能同時用 s = s & "當前用戶: " & item.username & vbCrLf s = s & "啟動狀態" & item.BootupState & vbCrLf s = s & "該計算機屬於" & item.PrimaryOwnerName & vbCrLf s = s & "系統類型" & item.CreationClassName & vbCrLf s = s & "計算機類類型" & item.Description & vbCrLf For i = 0 To 1 『這裡假設安裝了兩個系統 s = s & Chr(5) & "啟動選項" & i & " :" & item.SystemStartupOptions(i) _ & vbCrLf Next i Next Text1.Text = s End Sub 運行程序,點擊Command1,在textBox中就可以顯示計算機的信息。 在上面的代碼中,程序通過GetObject("winmgmts:")獲得WMI對象,然後獲得下面的Win32_ComputerSystem子項並通過訪問Win32_ComputerSystem對象中的分項獲得系統中的信息。需要說明的是,並不是所有的系統都支持WMI,在有些系統中無法顯示生產廠家等信息。 現在的計算機以及網路組成十分複雜。例如系統硬體方面就有主板、硬碟、網卡... 。軟體方面有操作系統、系統中安裝的軟體、正在運行的進程等等。網路方面有域、工作組等等。利用WMI可以訪問上面的全部信息,但是如果向上面一樣的利用分項來訪問的話會很麻煩。為此,WMI提供了一種類似SQL語句的查詢語句,可以通過查詢語句獲得WMI對象下的子項。 下面是一個遍歷系統中安裝的網卡並返回網卡MAC地址的代碼:Private Function MACAddress() As String Set objs = GetObject("winmgmts:").ExecQuery( _ "SELECT MACAddress " & _ "FROM Win32_NetworkAdapter " & _ "WHERE " & _ "((MACAddress Is Not NULL) " & _ "AND (Manufacturer <> " & _ "『Microsoft『))") For Each obj In objs MACAddress = obj.MACAddress Exit For Next objEnd Function 上面的代碼獲得WMI對象,然後運行ExecQuery執行一個WMI查詢語句獲得安裝的網卡並返回網卡的MAC地址。 WMI還支持事件處理,讓程序可以處理系統事件,例如程序運行、關閉,可移動驅動器的插入、取出等。下面是一個可以對系統中運行程序進行監控的程序。 首先建立一個新工程,然後點擊菜單的 project | references 項,在references列表中選中Microsoft WMI Scripting Library將WMI對象庫加入工程中。然後在Form1中加入一個ListBox控制項,然後在Form1中加入以下代碼:Option Explicit Dim Locator As SWbemLocatorDim Services As SWbemServicesDim WithEvents StatusSink As SWbemSinkPrivate Sub KillEvents() StatusSink.Cancel Set StatusSink = NothingEnd SubPrivate Sub Form_Load() Dim Query As String Set StatusSink = New SWbemSink Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Services = Locator.ConnectServer() Query = "SELECT * FROM __InstanceCreationEvent " Query = Query + "WITHIN 1 " Query = Query + "WHERE TargetInstance ISA 『Win32_Process『" Services.ExecNotificationQueryAsync StatusSink, QueryEnd Sub Private Sub StatusSink_OnObjectReady(ByVal StatusEvent As SWbemObject, _ ByVal EventContext As SWbemNamedValueSet) Dim arr Dim strQue As String Dim i As Integer List1.Clear arr = Split(StatusEvent.GetObjectText_, Chr(10)) For i = LBound(arr) To UBound(arr) List1.AddItem arr(i) Next iEnd Sub Private Sub StatusSink_OnCompleted(ByVal HResult As WbemErrorEnum, _ ByVal ErrorObject As SWbemObject, _ ByVal EventContext As SWbemNamedValueSet) If HResult <> wbemErrCallCancelled Then 『錯誤處理 End IfEnd Sub 在上面的程序中定義了一個SWbemSink對象StatusSink,然後建立一個SWbemServices對象Server,並將StatusSink連接到Server對象上。這樣就可以通過StatusSink監控程序的運行。 運行程序,然後任意運行一個程序,在Form1的ListBox中就可以列出運行的程序的信息。 WMI應用最強大的一面是可以通過WEB頁面來實現遠程管理。下面我們來建立一個HTML頁面,該頁面可以實現向上面的VB程序一樣動態監控系統中運行的程序。監控系統中程序運行的HTML代碼如下:

保存代碼為Htm後綴的頁面文件。雙擊打開網頁,然後運行一個程序,在網頁上就可以列出運行的程序的文件名。 以上簡要的介紹了一下WMI的應用,實際上WMI對象的操作是十分複雜,功能也是很強大的,例如你可以通過WMI在伺服器上監控整個區域網上的計算機、向區域網上的計算機批量安裝軟體(例如殺毒軟體)。通過頁面遠程訪問伺服器,控制項伺服器運行程序,添加用戶等。關於更多的WMI的應用,讀者可以訪問MSDN上WMI開發的主頁:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp獲取更多信息。 以上程序在Win2000專業版下編寫。
推薦閱讀:
查看原文 >>
相關文章