快捷搜索:

Visual Basic编程访问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)

Next

End 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 obj

End Function

上面的代码得到WMI工具,然后运行ExecQuery履行一个WMI查询语句得到安装的网卡并返回网卡的MAC地址。

WMI还支持事故处置惩罚,让法度榜样可以处置惩罚系统事故,例如法度榜样运行、关闭,可移动驱动器的插入、掏出等。下面是一个可以对系统中运行法度榜样进行监控的法度榜样。

首先建立一个新工程,然后点击菜单的 project | references 项,在references列表中选中Microsoft WMI Scripting Library将WMI工具库加入工程中。然后在Form1中加入一个ListBox控件,然后在Form1中加入以下代码:

Option Explicit

Dim Locator As SWbemLocator

Dim Services As SWbemServices

Dim WithEvents StatusSink As SWbemSink

Private Sub KillEvents()

StatusSink.Cancel

Set StatusSink = Nothing

End Sub

Private 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, Query

End 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 i

End Sub

Private Sub StatusSink_OnCompleted(ByVal HResult As WbemErrorEnum, _

ByVal ErrorObject As SWbemObject, _

ByVal EventContext As SWbemNamedValueSet)

If HResult <> wbemErrCallCancelled Then

‘差错处置惩罚

End If

End Sub

在上面的法度榜样中定义了一个SWbemSink工具StatusSink,然后建立一个SWbemServices工具Server,并将StatusSink连接到Server工具上。这样就可以经由过程StatusSink监控法度榜样的运行。

运行法度榜样,然后随意率性运行一个法度榜样,在Form1的ListBox中就可以列出运行的法度榜样的信息。

WMI利用最强大年夜的一壁是可以经由过程WEB页面来实现远程治理。下面我们来建立一个HTML页面,该页面可以实现向上面的VB法度榜样一样动态监控系统中运行的法度榜样。监控系统中法度榜样运行的HTML代码如下:

<html>

<head>

<object ID="mysink" CLASSID= "CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223"></object>

</head>

<SCRIPT>

function window.onload()

{

var locator = new ActiveXObject ("WbemScripting.SWbemLocator");

var service = locator.ConnectServer();

szQuery = "SELECT * FROM __InstanceCreationEvent ";

szQuery += "WITHIN 1 ";

szQuery += "WHERE TargetInstance ISA ‘Win32_Process‘";

service.ExecNotificationQueryAsync(mysink,szQuery);

}

</SCRIPT>

<script FOR="mysink" EVENT="OnObjectReady(obj, objAsyncContext)">

document.all.info.innerHTML += obj.TargetInstance.Name + "<br>";

</script>

<body>

<span ID="info"></span>

</body>

</html>

保存代码为Htm后缀的页面文件。双击打开网页,然后运行一个法度榜样,在网页上就可以列出运行的法度榜样的文件名。

以上简要的先容了一下WMI的利用,实际上WMI工具的操作是十分繁杂,功能也是很强大年夜的,例如你可以经由过程WMI在办事器上监控全部局域网上的谋略机、向局域网上的谋略机批量安装软件(例如杀毒软件)。经由过程页面远程造访办事器,控件办事器运行法度榜样,添加用户等。关于更多的WMI的利用,读者可以造访MSDN上WMI开拓的主页:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp

获取更多信息。

您可能还会对下面的文章感兴趣: