时间: 2021-07-31 作者:daque
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东西的典型,这个典型赢得计划机的消息。 创造一个新工程,在form第11中学增添一个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东西库介入工程中。而后在form第11中学介入一个listbox控件, 而后在form第11中学介入以次代码: 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在效劳器上监察和控制所有局域网上的计划机、向局域网上的计划机批量安置软硬件(比方杀毒软硬件)。经过页面长途考察效劳器,控件效劳器运路途序,增添用户等。