利用WMI獲取系統(tǒng)信息
發(fā)布時間:2020-07-31 來源: 工作計劃 點擊:
用 利用 WMI 獲取系統(tǒng)信息
WMI(Windows Management Instrumentation)技術(shù)是微軟提供的 Windows 下的系統(tǒng)管理工具。通過該工具可以在本地或者管理客戶端系統(tǒng)中幾乎一切的信息。很多專業(yè)的網(wǎng)絡(luò)管理工具都是基于 WMI 開發(fā)的。該工具在 Win2000 以及WinNT 下是標準工具,在 Win9X 下是擴展安裝選項。本文將介紹如何通過 VB 編程來訪問 WMI 對象的編程。首先來看一個簡單的通過 WMI 獲取系統(tǒng)信息的范例,這個范例通過 WMI 對象獲得系統(tǒng)中運行的的進程: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")獲得系統(tǒng)中所有的進程列表子項。下面看一個完整的訪問 WMI 對象的范例,這個范例獲得計算機的信息。建立一個新工程,在 Form1 中添加一個 TextBox 控件以及一個CommandButton 控件,在 CommandButton 的 Click 事件中寫入以下的代碼: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&"計算機名稱:"&item.name&vbCrLf s=s&"狀態(tài):"&item.Status&vbCrLf s=s&"類型:"&item.SystemType&vbCrLf s=s&"生產(chǎn)廠家:"&item.Manufacturer&vbCrLf s=s&"型號:"&item.Model&vbCrLf s=s&"內(nèi)存:~"&item.totalPhysicalMemory24000&"mb"&vbCrLf s=s&"域:"&item.domain&vbCrLf"s=s&"工作組"&item.Workgroup&vbCrLf"獲得工作組和域的選項不能同時用 s=s&"當(dāng)前用戶:"&item.username&vbCrLf s=s&"啟動狀態(tài)"&item.BootupState&vbCrLf s=s&"該計算機屬于"&item.PrimaryOwnerName&vbCrLf s=s&"系統(tǒng)類型"&item.CreationClassName&vbCrLf s=s&"計算機類類型"&item.Description&vbCrLf For i=0 To 1"這里假設(shè)安裝了兩個系統(tǒng)s=s&Chr(5)&"啟動選項"&i&":"&item.SystemStartupOptions(i)_&vbCrLf Next iNext Text1.Text=s End Sub 運行程序,點擊 Command1,在 textBox 中
就可以顯示計算機的信息。在上面的代碼中,程序通過GetObject("winmgmts:")獲得 WMI 對象,然后獲得下面的Win32_ComputerSystem 子項并通過訪問 Win32_ComputerSystem 對象中的分項獲得系統(tǒng)中的信息。需要說明的是,并不是所有的系統(tǒng)都支持 WMI,在有些系統(tǒng)中無法顯示生產(chǎn)廠家等信息,F(xiàn)在的計算機以及網(wǎng)絡(luò)組成十分復(fù)雜。例如系統(tǒng)硬件方面就有主板、硬盤、網(wǎng)卡.。軟件方面有操作系統(tǒng)、系統(tǒng)中安裝的軟件、正在運行的進程等等。網(wǎng)絡(luò)方面有域、工作組等等。利用 WMI 可以訪問上面的全部信息,但是如果向上面一樣的利用分項來訪問的話會很麻煩。為此,WMI 提供了一種類似 SQL 語句的查詢語句,可以通過查詢語句獲得 WMI 對象下的子項。下面是一個遍歷系統(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 對象,然后運行 ExecQuery 執(zhí)行一個 WMI 查詢語句獲得安裝的網(wǎng)卡并返回網(wǎng)卡的 MAC 地址。WMI 還支持事件處理,讓程序可以處理系統(tǒng)事件,例如程序運行、關(guān)閉,可移動驅(qū)動器的插入、取出等。下面是一個可以對系統(tǒng)中運行程序進行監(jiān)控的程序。首先建立一個新工程,然后點擊菜單的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 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"錯誤處理 End If End Sub 在上面的程序中定義了一個 SWbemSink 對象 StatusSink,然后建立一個 SWbemServices 對象 Server,并將 StatusSink 連接到 Server 對象上。這樣就可以通過 StatusSink 監(jiān)控程序的運行。運行程序,然后任意運行一個程序,在 Form1 的 ListBox 中就可以列出運行的程序的信息。
WMI 腳本高手不完全手冊
2006-10-08 12:02:39
要成為 WMI 腳本高手當(dāng)要認識一下什么叫 WMI 啦,下面將介紹一下有關(guān)WMI 的東西。Windows 管理規(guī)范(Windows Management Instrumentation)是一項核心的 Windows 管理技術(shù);用戶可以使用 WMI 管理本地和遠程計算機。WMI 通過編程和腳本語言為日常管理提供了一條連續(xù)一致的途徑。用戶可以:1.在遠程計算機器上啟動一個進程。2.設(shè)定一個在特定日期和時間運行的進程。3.遠程啟動計算機。4.獲得本地或遠程計算機的已安裝程序列表。5.查詢本地或遠程計算機的 Windows 事件日志。而 WMI 適用的運得環(huán)境也是有些限制的,WMI適用于所有最新版本的 Windows。WMI 附帶在 Windows Me、Windows 2000、Windows XP 和 Windows Server 2003 之中。對于 Windows 98 和 Windows NT 4.0,可以訪問并搜索"Windows Management Instrumentation(WMI)CORE 1.5(Windows 95/98/NT 4.0)"。注意:在 Windows NT 4.0 上安裝并運行 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 腳本可以正常的運行,Windows 里的 WMI 服務(wù)(winmgmt)保證是運行的,這樣才可以實現(xiàn) WMI 里的更多功能。好了,關(guān)于 WMI的一些基本的信息資料就說到這,要想看更多的可以到 MicroSoft 網(wǎng)站的 MSDN
找。下面就簡單的講一下 WMI 腳本編寫的基本要素,看看下面的代碼://這個腳本是查看系統(tǒng)啟動的引導(dǎo)配置參數(shù),下面我們來看看關(guān)于 WMI 腳本編寫的架構(gòu)。On Error Resume Next//下面這行是比較重要的,它定義了主機的變量,可以是本機或遠程主機,域上的機等,參數(shù)英文的"."是表示本機,要想實現(xiàn)其它機的可以填上其它機的主機名或 IP。strComputer="."//下面這行是通過GetObject 得到主機的 WMI 對象管理空間"\root\cimv2",如果是本機的是通過NT(Authentication)認證的,所以可以不用用戶名和密碼,而對于非本機或非域機的就要再加多幾條參數(shù),Set objWMIService=GetObject("winmgmts:\"&strComputer&"\root\cimv2")//執(zhí)行 WMI 數(shù)據(jù)對象的查詢//至于連接遠程的要用下面的語句 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 從上面的例子可以看出寫一個 WMI 的要求:1.得到主機的 WMI 對像管理空間 2.執(zhí)行 WMI 數(shù)據(jù)對象的查詢 3.利用數(shù)組列出相關(guān)學(xué)習(xí)編寫的架構(gòu)并不難,只要練多幾次就行了,但是學(xué)習(xí) WMI 的第一個難題就是它的子集對象,因為我們并不知道它的子集對象是什么,這樣寫起程序來就會力不從心了。要一下子知道這樣子集的對象也是不難的,只要在 MicroSoft 的 MSDN 找找會有不少,但是這樣找下去的話可能要找很久或資料不夠全,是不是有些難呢?其實 MicroSoft 公司的網(wǎng)站上有一個叫"scriptomatic"的工具,才 100 多 K,解壓后你們發(fā)覺真正有用的是那個才 12k 的"scriptomatic.hta"文件,雙擊打開后你會發(fā)覺是一個子集的數(shù)據(jù)列表,且還有例子呢。
以上就是查詢"Win32_BIOS"里的子集參數(shù),是不是很易實現(xiàn) WMI 腳本的編寫呢?朋友們,可曾記得大半年前是不是有一個這樣的漏洞:就是一個 GUEST 用戶權(quán)限可以用 WMI 的腳本實現(xiàn)加賬號的例子,其實就是一個 WMI 命名空間的安全性出現(xiàn)問題。下面我們打開計算機上的 MMC 看看如何設(shè)置 WMI 的安全權(quán)限。在運行菜單上打"MMC",然后在"文件"菜單上選"添加/刪除管理單元",然后在"獨立"的選項卡(默認)上按"添加",之后來到"添加獨立管理單元"列表。然后就
一路按"添加"、"確定"就可以了。返回到 MMC 的主介面上,然后右擊"WMI"單元選"屬性"。在 WMI 控件屬性對話框中單擊安全選項卡。一個名為 Root,前面帶加號(+)的文件夾將會出現(xiàn)。如果必要,展開這個樹狀結(jié)構(gòu),定位到想要設(shè)置權(quán)限的命名空間。單擊安全設(shè)置按鈕。一組用戶和權(quán)限顯示出來。如果用戶在這個列表中,請按照需要修改權(quán)限。如果用戶不再這個列表中,請單擊添加按鈕,然后從賬戶所在的位置(本地計算機、域等等)添加用戶。小提示:為了查看和設(shè)置 NameSpace 安全性,用戶必需擁有讀取安全設(shè)置和編輯安全設(shè)置權(quán)限。系統(tǒng)管理員默認具備這些權(quán)限,并可以按照需要將權(quán)限賦予其他用戶如果一個用戶需要遠程訪問命名空間,必須為其選中遠程啟用權(quán)限。默認情況下,針對一個命名空間設(shè)置的用戶權(quán)限只對該命名空間有效。如果希望用戶可以訪問該命名空間和其下所有子命名空間,或者只能訪問子命名空間,請單擊高級按鈕。單擊編輯并在出現(xiàn)的對話框中指定允許訪問的范圍。這樣就可以防止此類事情的發(fā)生,但是透過此類的 WMI 命名空間的安全設(shè)置,也可以成為黑手會配置后門的地方,所以在架建一個安全的系統(tǒng),這里不能不看。今天的 WMI 技術(shù)就介紹到這里,文章寫得有些倉促,難免有問題,請各位多多指點小弟。
利用 GetObject("WinMgmts:")獲取系統(tǒng)信息
利用 GetObject("WinMgmts:")獲取系統(tǒng)信息收藏用 WMI 對象列出系統(tǒng)所有進程:
--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ù)及運行狀態(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 的序列號:
---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
硬盤型號:---HDID.vbs---Dim HDid,moc set moc=GetObject("Winmgmts:").InstancesOf("Win32_DiskDrive")for each mo in moc HDid=mo.Model msgbox"硬盤型號為:"&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
測試你的顯卡:
On Error Resume Next Dim ye Dim yexj00 set yexj00=GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_VideoController")for each ye in yexj00 msgbox"型號:"&ye.VideoProcessor&vbCrLf&"廠商:"&ye.AdapterCompatibility&vbCrLf&"名稱:"&ye.Name&vbCrLf&"狀態(tài):"&ye.Status&vbCrLf&"顯存:"&(ye.AdapterRAM24000)&"MB"&vbCrLf&"驅(qū)動(dll):"&ye.InstalledDisplayDrivers&vbCrLf&"驅(qū)動(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.記錄激動時刻,贏取超級大獎!點擊鏈接,和我一起參加"2010:我的世界杯 Blog 日志"活動!
特別聲明:
1 :資料來源于互聯(lián)網(wǎng),版權(quán)歸屬原作者 2 :資料內(nèi)容屬于網(wǎng)絡(luò)意見,與本賬號立場無關(guān) 3 :如有侵權(quán),請告知,立即刪除。
熱點文章閱讀