奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 程序开发 >> VB >> Visual Basic编程访问WMI对象
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
  • VB中使用WinSock控件传

  • VB API函数介绍——控

  • VB从零开始编外挂(完整

  • VB.Net实现Web Servic

  • 老树新芽 体验Visual 

  • vb中利用xmlhttp来下载

  • vb中使用正则表达式

  • ASP.NET中Cookie编程的

  • Visual Basic编程访问WMI对象
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-22

      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

      获取更多信息。

    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.