利用WMI獲取系統(tǒng)信息
發(fā)布時(shí)間:2020-07-31 來(lái)源: 工作計(jì)劃 點(diǎn)擊:
用 利用 WMI 獲取系統(tǒng)信息
WMI(Windows Management Instrumentation)技術(shù)是微軟提供的 Windows 下的系統(tǒng)管理工具。通過(guò)該工具可以在本地或者管理客戶端系統(tǒng)中幾乎一切的信息。很多專(zhuān)業(yè)的網(wǎng)絡(luò)管理工具都是基于 WMI 開(kāi)發(fā)的。該工具在 Win2000 以及WinNT 下是標(biāo)準(zhǔn)工具,在 Win9X 下是擴(kuò)展安裝選項(xiàng)。本文將介紹如何通過(guò) VB 編程來(lái)訪問(wèn) WMI 對(duì)象的編程。首先來(lái)看一個(gè)簡(jiǎn)單的通過(guò) WMI 獲取系統(tǒng)信息的范例,這個(gè)范例通過(guò) WMI 對(duì)象獲得系統(tǒng)中運(yùn)行的的進(jìn)程: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 在上面的代碼中,首先通過(guò) GetObject("WinMgmts:")獲得 WMI 對(duì)象,在 WMI 對(duì)象下有很多的子項(xiàng),在這里我們通過(guò) WMI.InstancesOf("Win32_Process")獲得系統(tǒng)中所有的進(jìn)程列表子項(xiàng)。下面看一個(gè)完整的訪問(wèn) WMI 對(duì)象的范例,這個(gè)范例獲得計(jì)算機(jī)的信息。建立一個(gè)新工程,在 Form1 中添加一個(gè) TextBox 控件以及一個(gè)CommandButton 控件,在 CommandButton 的 Click 事件中寫(xiě)入以下的代碼:Private Sub Command1_Click()Dim s,System,item Dim iAs 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&"計(jì)算機(jī)名稱(chēng):"&item.name&vbCrLf s=s&"狀態(tài):"&item.Status&vbCrLf s=s&"類(lèi)型:"&item.SystemType&vbCrLf s=s&"生產(chǎn)廠家:"&item.Manufacturer&vbCrLf s=s&"型號(hào):"&item.Model&vbCrLf s=s&"內(nèi)存:~"&item.totalPhysicalMemory24000&"mb"&vbCrLf s=s&"域:"&item.domain&vbCrLf"s=s&"工作組"&item.Workgroup&vbCrLf"獲得工作組和域的選項(xiàng)不能同時(shí)用 s=s&"當(dāng)前用戶:"&item.username&vbCrLf s=s&"啟動(dòng)狀態(tài)"&item.BootupState&vbCrLf s=s&"該計(jì)算機(jī)屬于"&item.PrimaryOwnerName&vbCrLf s=s&"系統(tǒng)類(lèi)型"&item.CreationClassName&vbCrLf s=s&"計(jì)算機(jī)類(lèi)類(lèi)型"&item.Description&vbCrLf For i=0 To 1"這里假設(shè)安裝了兩個(gè)系統(tǒng)s=s&Chr(5)&"啟動(dòng)選項(xiàng)"&i&":"&item.SystemStartupOptions(i)_&vbCrLf Next iNext Text1.Text=s End Sub 運(yùn)行程序,點(diǎn)擊 Command1,在 textBox 中
就可以顯示計(jì)算機(jī)的信息。在上面的代碼中,程序通過(guò)GetObject("winmgmts:")獲得 WMI 對(duì)象,然后獲得下面的Win32_ComputerSystem 子項(xiàng)并通過(guò)訪問(wèn) Win32_ComputerSystem 對(duì)象中的分項(xiàng)獲得系統(tǒng)中的信息。需要說(shuō)明的是,并不是所有的系統(tǒng)都支持 WMI,在有些系統(tǒng)中無(wú)法顯示生產(chǎn)廠家等信息,F(xiàn)在的計(jì)算機(jī)以及網(wǎng)絡(luò)組成十分復(fù)雜。例如系統(tǒng)硬件方面就有主板、硬盤(pán)、網(wǎng)卡.。軟件方面有操作系統(tǒng)、系統(tǒng)中安裝的軟件、正在運(yùn)行的進(jìn)程等等。網(wǎng)絡(luò)方面有域、工作組等等。利用 WMI 可以訪問(wèn)上面的全部信息,但是如果向上面一樣的利用分項(xiàng)來(lái)訪問(wèn)的話會(huì)很麻煩。為此,WMI 提供了一種類(lèi)似 SQL 語(yǔ)句的查詢語(yǔ)句,可以通過(guò)查詢語(yǔ)句獲得 WMI 對(duì)象下的子項(xiàng)。下面是一個(gè)遍歷系統(tǒng)中安裝的網(wǎng)卡并返回網(wǎng)卡 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 對(duì)象,然后運(yùn)行 ExecQuery 執(zhí)行一個(gè) WMI 查詢語(yǔ)句獲得安裝的網(wǎng)卡并返回網(wǎng)卡的 MAC 地址。WMI 還支持事件處理,讓程序可以處理系統(tǒng)事件,例如程序運(yùn)行、關(guān)閉,可移動(dòng)驅(qū)動(dòng)器的插入、取出等。下面是一個(gè)可以對(duì)系統(tǒng)中運(yùn)行程序進(jìn)行監(jiān)控的程序。首先建立一個(gè)新工程,然后點(diǎn)擊菜單的project|references 項(xiàng),在 references 列表中選中 Microsoft WMI Scripting Library 將 WMI 對(duì)象庫(kù)加入工程中。然后在 Form1 中加入一個(gè) 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 iAs Integer List1.Clear arr=Split(StatusEvent.GetObjectText_,Chr(10))For i=LBound(arr)To UBound(arr)List1.AddItem arr(i)Next iEnd Sub Priv ate Sub StatusSink_OnCompleted(ByVal HResult As WbemErrorEnum,_ ByVal ErrorObject As SWbemObject,_ ByVal EventContext As SWbemNamedValueSet)If HResult wbemErrCallCancelled Then"錯(cuò)誤處理 End If End Sub 在上面的程序中定義了一個(gè) SWbemSink 對(duì)象 StatusSink,然后建立一個(gè) SWbemServices 對(duì)象 Server,并將 StatusSink 連接到 Server 對(duì)象上。這樣就可以通過(guò) StatusSink 監(jiān)控程序的運(yùn)行。運(yùn)行程序,然后任意運(yùn)行一個(gè)程序,在 Form1 的 ListBox 中就可以列出運(yùn)行的程序的信息。
WMI 腳本高手不完全手冊(cè)
2006-10-08 12:02:39
要成為 WMI 腳本高手當(dāng)要認(rèn)識(shí)一下什么叫 WMI 啦,下面將介紹一下有關(guān)WMI 的東西。Windows 管理規(guī)范(Windows Management Instrumentation)是一項(xiàng)核心的 Windows 管理技術(shù);用戶可以使用 WMI 管理本地和遠(yuǎn)程計(jì)算機(jī)。WMI 通過(guò)編程和腳本語(yǔ)言為日常管理提供了一條連續(xù)一致的途徑。用戶可以:1.在遠(yuǎn)程計(jì)算機(jī)器上啟動(dòng)一個(gè)進(jìn)程。2.設(shè)定一個(gè)在特定日期和時(shí)間運(yùn)行的進(jìn)程。3.遠(yuǎn)程啟動(dòng)計(jì)算機(jī)。4.獲得本地或遠(yuǎn)程計(jì)算機(jī)的已安裝程序列表。5.查詢本地或遠(yuǎn)程計(jì)算機(jī)的 Windows 事件日志。而 WMI 適用的運(yùn)得環(huán)境也是有些限制的,WMI適用于所有最新版本的 Windows。WMI 附帶在 Windows Me、Windows 2000、Windows XP 和 Windows Server 2003 之中。對(duì)于 Windows 98 和 Windows NT 4.0,可以訪問(wèn)并搜索"Windows Management Instrumentation(WMI)CORE 1.5(Windows 95/98/NT 4.0)"。注意:在 Windows NT 4.0 上安裝并運(yùn)行 WMI 之前,需要首先安裝 Service Pack 4 或更高版本。WMI 需要的其他軟件包括:1.Microsoft Internet Explorer 5.0 或更高版本。2.Windows script Host(WSH)。Windows 2000、Windows XP、Windows Server 2003、和 Windows Me 附帶的 WSH,而不是 Windows NT4 或 Windows 98 附帶的 WSH。您可以從以下地址下載 WSH WSH 的最新版本--包括在 Windows XP 和 Windows Server 2003 之中--是 WSH 5.6。要使 WMI 腳本可以正常的運(yùn)行,Windows 里的 WMI 服務(wù)(winmgmt)保證是運(yùn)行的,這樣才可以實(shí)現(xiàn) WMI 里的更多功能。好了,關(guān)于 WMI的一些基本的信息資料就說(shuō)到這,要想看更多的可以到 MicroSoft 網(wǎng)站的 MSDN
找。下面就簡(jiǎn)單的講一下 WMI 腳本編寫(xiě)的基本要素,看看下面的代碼://這個(gè)腳本是查看系統(tǒng)啟動(dòng)的引導(dǎo)配置參數(shù),下面我們來(lái)看看關(guān)于 WMI 腳本編寫(xiě)的架構(gòu)。On Error Resume Next//下面這行是比較重要的,它定義了主機(jī)的變量,可以是本機(jī)或遠(yuǎn)程主機(jī),域上的機(jī)等,參數(shù)英文的"."是表示本機(jī),要想實(shí)現(xiàn)其它機(jī)的可以填上其它機(jī)的主機(jī)名或 IP。strComputer="."//下面這行是通過(guò)GetObject 得到主機(jī)的 WMI 對(duì)象管理空間"\root\cimv2",如果是本機(jī)的是通過(guò)NT(Authentication)認(rèn)證的,所以可以不用用戶名和密碼,而對(duì)于非本機(jī)或非域機(jī)的就要再加多幾條參數(shù),Set objWMIService=GetObject("winmgmts:\"&strComputer&"\root\cimv2")//執(zhí)行 WMI 數(shù)據(jù)對(duì)象的查詢//至于連接遠(yuǎn)程的要用下面的語(yǔ)句 Set objLocator=CreateObject("Wbems cripting.SWbemLocator")Set objService=objLocator.ConnectServer(strComputer,"root\cimv2","administrator","a")Set colItems=objWMIService.ExecQuery("Select*from Win32_BootConfiguration",48)
//利用數(shù)組列出相關(guān) For Each objItem in colItems Wscript.Echo"BootDirectory:"&objItem.BootDirectory Next 從上面的例子可以看出寫(xiě)一個(gè) WMI 的要求:1.得到主機(jī)的 WMI 對(duì)像管理空間 2.執(zhí)行 WMI 數(shù)據(jù)對(duì)象的查詢 3.利用數(shù)組列出相關(guān)學(xué)習(xí)編寫(xiě)的架構(gòu)并不難,只要練多幾次就行了,但是學(xué)習(xí) WMI 的第一個(gè)難題就是它的子集對(duì)象,因?yàn)槲覀儾⒉恢浪淖蛹瘜?duì)象是什么,這樣寫(xiě)起程序來(lái)就會(huì)力不從心了。要一下子知道這樣子集的對(duì)象也是不難的,只要在 MicroSoft 的 MSDN 找找會(huì)有不少,但是這樣找下去的話可能要找很久或資料不夠全,是不是有些難呢?其實(shí) MicroSoft 公司的網(wǎng)站上有一個(gè)叫"scriptomatic"的工具,才 100 多 K,解壓后你們發(fā)覺(jué)真正有用的是那個(gè)才 12k 的"scriptomatic.hta"文件,雙擊打開(kāi)后你會(huì)發(fā)覺(jué)是一個(gè)子集的數(shù)據(jù)列表,且還有例子呢。
以上就是查詢"Win32_BIOS"里的子集參數(shù),是不是很易實(shí)現(xiàn) WMI 腳本的編寫(xiě)呢?朋友們,可曾記得大半年前是不是有一個(gè)這樣的漏洞:就是一個(gè) GUEST 用戶權(quán)限可以用 WMI 的腳本實(shí)現(xiàn)加賬號(hào)的例子,其實(shí)就是一個(gè) WMI 命名空間的安全性出現(xiàn)問(wèn)題。下面我們打開(kāi)計(jì)算機(jī)上的 MMC 看看如何設(shè)置 WMI 的安全權(quán)限。在運(yùn)行菜單上打"MMC",然后在"文件"菜單上選"添加/刪除管理單元",然后在"獨(dú)立"的選項(xiàng)卡(默認(rèn))上按"添加",之后來(lái)到"添加獨(dú)立管理單元"列表。然后就
一路按"添加"、"確定"就可以了。返回到 MMC 的主介面上,然后右擊"WMI"單元選"屬性"。在 WMI 控件屬性對(duì)話框中單擊安全選項(xiàng)卡。一個(gè)名為 Root,前面帶加號(hào)(+)的文件夾將會(huì)出現(xiàn)。如果必要,展開(kāi)這個(gè)樹(shù)狀結(jié)構(gòu),定位到想要設(shè)置權(quán)限的命名空間。單擊安全設(shè)置按鈕。一組用戶和權(quán)限顯示出來(lái)。如果用戶在這個(gè)列表中,請(qǐng)按照需要修改權(quán)限。如果用戶不再這個(gè)列表中,請(qǐng)單擊添加按鈕,然后從賬戶所在的位置(本地計(jì)算機(jī)、域等等)添加用戶。小提示:為了查看和設(shè)置 NameSpace 安全性,用戶必需擁有讀取安全設(shè)置和編輯安全設(shè)置權(quán)限。系統(tǒng)管理員默認(rèn)具備這些權(quán)限,并可以按照需要將權(quán)限賦予其他用戶如果一個(gè)用戶需要遠(yuǎn)程訪問(wèn)命名空間,必須為其選中遠(yuǎn)程啟用權(quán)限。默認(rèn)情況下,針對(duì)一個(gè)命名空間設(shè)置的用戶權(quán)限只對(duì)該命名空間有效。如果希望用戶可以訪問(wèn)該命名空間和其下所有子命名空間,或者只能訪問(wèn)子命名空間,請(qǐng)單擊高級(jí)按鈕。單擊編輯并在出現(xiàn)的對(duì)話框中指定允許訪問(wèn)的范圍。這樣就可以防止此類(lèi)事情的發(fā)生,但是透過(guò)此類(lèi)的 WMI 命名空間的安全設(shè)置,也可以成為黑手會(huì)配置后門(mén)的地方,所以在架建一個(gè)安全的系統(tǒng),這里不能不看。今天的 WMI 技術(shù)就介紹到這里,文章寫(xiě)得有些倉(cāng)促,難免有問(wèn)題,請(qǐng)各位多多指點(diǎn)小弟。
利用 GetObject("WinMgmts:")獲取系統(tǒng)信息
利用 GetObject("WinMgmts:")獲取系統(tǒng)信息收藏用 WMI 對(duì)象列出系統(tǒng)所有進(jìn)程:
--Instance.vbs--
Dim WMI,objs Set WMI=GetObject("WinMgmts:")Set objs=WMI.InstancesOf("Win32_Process")For Each obj In objs Enum1=Enum1+obj.Description+Chr(13)+Chr(10)Next msgbox Enum1
獲得物理內(nèi)存的容量:
---physicalMemory.vbs---
strComputer="."
Set wbemServices=GetObject("winmgmts:\"&strComputer)Set wbemObjectSet=wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")
For Each wbemObject In wbemObjectSet WScript.Echo"物理內(nèi)存(MB):"&CInt(wbemObject.TotalPhysicalMemory/1024)Next
取得系統(tǒng)所有服務(wù)及運(yùn)行狀態(tài)
--service.vbs--Set ServiceSet=GetObject("winmgmts:").InstancesOf("Win32_Service")Dim s,infor infor=""for each sin ServiceSet infor=infor+s.Description+"=="+s.State+chr(13)+chr(10)next msgbox infor CPU 的序列號(hào):
---CPUID.vbs---
Dim cpuInfo cpuInfo=""set moc=GetObject("Winmgmts:").InstancesOf("Win32_Processor")for each mo in moc cpuInfo=CStr(mo.ProcessorId)msgbox"CPU SerialNumber is:"&cpuInfo next
硬盤(pán)型號(hào):---HDID.vbs---Dim HDid,moc set moc=GetObject("Winmgmts:").InstancesOf("Win32_DiskDrive")for each mo in moc HDid=mo.Model msgbox"硬盤(pán)型號(hào)為:"&HDid next
網(wǎng)卡 MAC 物理地址:
---MACAddress.vbs---Dim mc set mc=GetObject("Winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")for each mo in mc if mo.IPEnabled=true then msgbox"網(wǎng)卡 MAC 地址是:"&mo.MacAddress exit for end if next
測(cè)試你的顯卡:
On Error Resume Next Dim ye Dim yexj00 set yexj00=GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_VideoController")for each ye in yexj00 msgbox"型號(hào):"&ye.VideoProcessor&vbCrLf&"廠商:"&ye.AdapterCompatibility&vbCrLf&"名稱(chēng):"&ye.Name&vbCrLf&"狀態(tài):"&ye.Status&vbCrLf&"顯存:"&(ye.AdapterRAM24000)&"MB"&vbCrLf&"驅(qū)動(dòng)(dll):"&ye.InstalledDisplayDrivers&vbCrLf&"驅(qū)動(dòng)(inf):"&ye.inf"版本:"&ye.DriverVersion next
*
"WinMgmts:"Prefix Microsoft Windows 2000 Scripting Guide WMI monikers can consist of three parts:one mandatory component and two optional co mponents.The mandatory component is the"winmgmts:"prefix.All WMI monikers must begin with"winmgmts:"as shown here:
Set objSWbemServices=GetObject("winmgmts:")The moniker in this code is the string"winmgmts:",which is passed to the GetObject function.Although in this example the string is entered using all lowercase letters,you can use whatever case you like;that is,"WinMgmts:","WINMGMTS:",and"winmgmts:"all produce the same result.
Specifying amoniker that consists only of the"winmgmts:"prefix is the most basic form of WMI moniker you can use.The result is always areference to an SWbemServices object,which represents aconnection to the Windows Management Instrumentation service on the local computer.Under the covers,the"winmgmts:"moniker:
1.Retrieves the WMI CLSID from the registry subkey HKCR\WINMGMTS\CLSID.The CLSID({172BDDF8-CEEA-11D1-8B05-00600806D9B6})is the identifier used by the operating system to map WMI to the appropriate COM object.
2.Retrieves the value from asecond registry entry,HKCR\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6}\InProcServer32.This value(typically C:\Windows\System32\wbem\wbemdisp.dll)indicates the path to the COM object that exposes the SWbemServices object.
3.Loads Wbemdisp.dll,the DLL containing the WMI scripting library that exposes SWbemServices.
After you have obtained areference to SWbemServices,you can then invoke one of the object methods as shown here:
Set objSWbemServices=GetObject("winmgmts:")Set colSWbemObjectSet=objSWbemServices.InstancesOf("Win32_LogicalDisk")In
this example,a reference variable named objSWbemServices is initialized using the"winmgmts:"moniker.This reference variable is subsequently used to invoke the InstancesOf method provided by the SWbemServices object.
Although the preceding example is perfectly acceptable,you do not have to use two lines of code to retrieve all Win32_LogicalDisk instances.This can also be done with the following single line of script:
Set colSWbemObjectSet=GetObject("winmgmts:").InstancesOf("Win32_LogicalDisk")In this case,a user-defined variable(objSWbemServices in the example preceding this one)is not used to explicitly reference the SWbemServices object commonly returned by GetObject and the WMI moniker.Instead,the"winmgmts:"moniker creates an SWbemServices reference in memory and immediately uses the unnamed,memory based refer ence to call the SWbemServices InstancesOf method.
In the end,both examples produce identical results in the form of an SWbemObjectSet collection containing all instances of the Win32_LogicalDisk class on the local computer.You can also call the ExecQuery method or any other method provided by the SWbemServices object.In fact,if the objective of your script is to simply enumerate and echo all Win32_LogicalDisk instances,you can get by with as little as the following:
For Each objDisk In GetObject("winmgmts:").InstancesOf("Win32_LogicalDisk")Wscript.Echo objDisk.DeviceID Next In this case,user-defined variables are not used to reference SWbemServices or SWbemObjectSet.Both objects are still created,but only in memory and without an explicit object reference.By using the most basic WMI moniker,and by understanding the relationship of the moniker with the WMI scripting library,you can begin to construct
concise yet powerful WMI statements.記錄激動(dòng)時(shí)刻,贏取超級(jí)大獎(jiǎng)!點(diǎn)擊鏈接,和我一起參加"2010:我的世界杯 Blog 日志"活動(dòng)!
特別聲明:
1 :資料來(lái)源于互聯(lián)網(wǎng),版權(quán)歸屬原作者 2 :資料內(nèi)容屬于網(wǎng)絡(luò)意見(jiàn),與本賬號(hào)立場(chǎng)無(wú)關(guān) 3 :如有侵權(quán),請(qǐng)告知,立即刪除。
熱點(diǎn)文章閱讀