เทคโนโลยี WMI (Windows Management Instrumentation) เป็นเครื่องมือการจัดการระบบภายใต้ Windows ที่จัดทำโดย Microsoft ด้วยเครื่องมือนี้ ข้อมูลเกือบทั้งหมดในระบบไคลเอ็นต์สามารถจัดการภายในเครื่องหรือบนระบบไคลเอ็นต์ได้ เครื่องมือการจัดการเครือข่ายระดับมืออาชีพจำนวนมากได้รับการพัฒนาโดยใช้ WMI เครื่องมือนี้เป็นเครื่องมือมาตรฐานภายใต้ Win2000 และ WinNT และตัวเลือกการติดตั้งเพิ่มเติมภายใต้ Win9X บทความนี้จะแนะนำวิธีการเข้าถึงการเขียนโปรแกรมวัตถุ WMI ผ่านการเขียนโปรแกรม VB
ขั้นแรก มาดูตัวอย่างง่ายๆ ของการได้รับข้อมูลระบบผ่าน WMI ตัวอย่างนี้รับกระบวนการที่ทำงานอยู่ในระบบผ่านออบเจ็กต์ WMI:
FunctionEnum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PRocess)
สำหรับแต่ละchobjInobjs
Enum1=Enum1 obj.คำอธิบาย Chr(13) Chr(10)
ต่อไป
EndFunction
ในโค้ดข้างต้น วัตถุ WMI จะได้รับครั้งแรกผ่าน GetObject(WinMgmts:) มีรายการย่อยมากมายภายใต้วัตถุ WMI ที่นี่เราได้รับรายการย่อยกระบวนการทั้งหมดในระบบผ่าน WMI.InstancesOf(Win32_Process)
ลองดูตัวอย่างที่สมบูรณ์ของการเข้าถึงวัตถุ WMI ตัวอย่างนี้ได้รับข้อมูลคอมพิวเตอร์
สร้างโครงการใหม่ เพิ่มตัวควบคุมกล่องข้อความและตัวควบคุม CommandButton ลงใน Form1 และเขียนโค้ดต่อไปนี้ในเหตุการณ์คลิกของ CommandButton:
PrivateSubCommand1_คลิก()
Dims,ระบบ,รายการ
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
สำหรับEachitemInSystem
'List1.AddItemitem.cputype'
s=ข้อมูลคอมพิวเตอร์&vbCrLf
s=s&****************************&vbCrLf
s=s&ชื่อคอมพิวเตอร์:&item.name&vbCrLf
s=s&สถานะ:&รายการ.สถานะ&vbCrLf
s=s&type:&item.SystemType&vbCrLf
s=s&ผู้ผลิต:&item.ผู้ผลิต&vbCrLf
s=s&model:&item.Model&vbCrLf
s=s&หน่วยความจำ:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&โดเมน:&item.domain&vbCrLf
ไม่สามารถใช้ตัวเลือก 's=s&Workgroup&item.Workgroup&vbCrLf' เพื่อขอรับเวิร์กกรุ๊ปและโดเมนพร้อมกันได้
s=s&ผู้ใช้ปัจจุบัน:&item.username&vbCrLf
s=s&สถานะการบูต&รายการ.BootupState&vbCrLf
s=s&คอมพิวเตอร์เครื่องนี้เป็นของ&item.PrimaryOwnerName&vbCrLf
s=s&ประเภทระบบ&รายการ.CreationClassName&vbCrLf
s=s&ประเภทคอมพิวเตอร์&item.Description&vbCrLf
Fori=0To1'ในที่นี้จะถือว่ามีการติดตั้งสองระบบ
s=s&Chr(5)&ตัวเลือกการเริ่มต้น&i&:&item.SystemStartupOptions(i)_
&vbCrLf
เน็กซ์ตี
ต่อไป
Text1.Text=s
สิ้นสุดย่อย
เรียกใช้โปรแกรมคลิก Command1 และข้อมูลคอมพิวเตอร์จะแสดงในกล่องข้อความ
ในโค้ดข้างต้น โปรแกรมได้รับวัตถุ WMI ผ่าน GetObject(winmgmts:) จากนั้นรับคีย์ย่อย Win32_ComputerSystem ต่อไปนี้ และรับข้อมูลในระบบโดยการเข้าถึงรายการย่อยในวัตถุ Win32_ComputerSystem
ควรสังเกตว่าไม่ใช่ทุกระบบที่รองรับ WMI และในบางระบบไม่สามารถแสดงข้อมูลเช่นผู้ผลิตได้
คอมพิวเตอร์และเครือข่ายในปัจจุบันมีความซับซ้อนมาก เช่น ในส่วนของฮาร์ดแวร์ระบบ ก็มี เมนบอร์ด ฮาร์ดไดร์ฟ การ์ดเน็ตเวิร์ก...
ในส่วนของซอฟต์แวร์ก็มีทั้งระบบปฏิบัติการ, ซอฟต์แวร์ที่ติดตั้งในระบบ, กระบวนการทำงาน เป็นต้น แง่มุมของเครือข่ายได้แก่ โดเมน เวิร์กกรุ๊ป ฯลฯ คุณสามารถใช้ WMI เพื่อเข้าถึงข้อมูลข้างต้นทั้งหมดได้ แต่จะยุ่งยากมากในการเข้าถึงโดยใช้รายการเดียวกันกับข้างต้น ด้วยเหตุนี้ WMI จึงจัดให้มีคำสั่งสืบค้นที่คล้ายกับคำสั่ง SQL ซึ่งสามารถรับรายการย่อยภายใต้วัตถุ WMI ได้
นี่คือรหัสที่วนซ้ำการ์ดเครือข่ายที่ติดตั้งในระบบและส่งคืนที่อยู่ MAC ของการ์ดเครือข่าย:
PrivateFunctionMACAAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECTMACAที่อยู่&_
FROMWin32_NetworkAdapter&_
ที่ไหน&_
((MACAAddressIsNotNULL)&_
และ(ผู้ผลิต<>&_
'ไมโครซอฟต์')))
สำหรับแต่ละchobjInobjs
MACAddress=obj.MACAAddress
ทางออกสำหรับ
ถัดไป obj
EndFunction
รหัสข้างต้นได้รับวัตถุ WMI จากนั้นเรียกใช้ ExecQuery เพื่อดำเนินการคำสั่งสอบถาม WMI เพื่อรับการ์ดเครือข่ายที่ติดตั้งและส่งกลับที่อยู่ MAC ของการ์ดเครือข่าย
WMI ยังรองรับการประมวลผลเหตุการณ์ ทำให้โปรแกรมสามารถจัดการกับเหตุการณ์ของระบบได้ เช่น การรันและการปิดโปรแกรม การใส่และการถอดไดรฟ์แบบถอดได้ เป็นต้น ด้านล่างนี้เป็นโปรแกรมที่สามารถตรวจสอบโปรแกรมที่ทำงานบนระบบได้
ขั้นแรกให้สร้างโปรเจ็กต์ใหม่ จากนั้นคลิกรายการอ้างอิงโปรเจ็กต์ในเมนู เลือก MicrosoftWMIScriptingLibrary ในรายการอ้างอิง และเพิ่มไลบรารีอ็อบเจ็กต์ WMI ลงในโปรเจ็กต์ เพิ่มตัวควบคุมกล่องรายการลงใน Form1 แล้วเพิ่มรหัสต่อไปนี้ลงใน Form1:
ตัวเลือกที่ชัดเจน
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
กิจกรรม PrivateSubKill()
StatusSink.ยกเลิก
SetStatusSink=ไม่มีอะไร
สิ้นสุดย่อย
ส่วนตัวSubForm_Load()
DimQueryAsString
SetStatusSink=NewSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
Query=SELECT*FROM__InstanceCreationEvent
แบบสอบถาม=แบบสอบถามภายใน1
Query=แบบสอบถาม WHERETargetInstanceISA'Win32_Process'
Services.ExecNotificationQueryAsyncStatusSink,แบบสอบถาม
สิ้นสุดย่อย
PrivateSubStatusSink_OnObjectReady (ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
ดิมาร์
DimstrQueAsString
DimiAsInteger
รายการ1.ล้าง
arr=แยก(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)ถึงUBound(arr)
List1.AddItemarr(i)
เน็กซ์ตี
สิ้นสุดย่อย
PrivateSubStatusSink_Onเสร็จสมบูรณ์ (ByValHResultAsWbemErrorEnum,_
ByValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<wbemErrCallCancelledแล้ว
'การจัดการข้อผิดพลาด
สิ้นสุดถ้า
สิ้นสุดย่อย
ในโปรแกรมข้างต้น มีการกำหนดวัตถุ SWbemSink StatusSink จากนั้นเซิร์ฟเวอร์วัตถุ SWbemServices จะถูกสร้างขึ้น และ StatusSink เชื่อมต่อกับวัตถุเซิร์ฟเวอร์ ด้วยวิธีนี้ สามารถตรวจสอบการทำงานของโปรแกรมผ่าน StatusSink
เรียกใช้โปรแกรม จากนั้นเรียกใช้โปรแกรมใดๆ และข้อมูลของโปรแกรมที่กำลังทำงานอยู่สามารถแสดงอยู่ในกล่องรายการของ Form1
ลักษณะที่ทรงพลังที่สุดของแอปพลิเคชัน WMI คือสามารถจัดการระยะไกลผ่านหน้าเว็บได้ ต่อไป เรามาสร้างหน้า HTML ซึ่งสามารถติดตามโปรแกรมที่ทำงานอยู่ในระบบแบบไดนามิกเหมือนกับโปรแกรม VB ด้านบนได้ โค้ด HTML สำหรับโปรแกรมที่ทำงานในระบบการมอนิเตอร์เป็นดังนี้:
<html>
<หัว>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223"></วัตถุ">
</หัว><
<สคริปต์>
functionwindow.onload()
-
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery =ภายใน1;
szQuery = WHERETargetInstanceISA'Win32_Process';
บริการ ExecNotificationQueryAsync (mysink, szQuery);
-
</สคริปต์>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</สคริปต์><
<ร่างกาย>
<spanID=ข้อมูล></span>
</ตัว>
</html>
บันทึกไฟล์เพจด้วยโค้ดเป็นส่วนต่อท้าย Htm ดับเบิลคลิกเพื่อเปิดเว็บเพจ จากนั้นเรียกใช้โปรแกรม ชื่อไฟล์ของโปรแกรมที่กำลังทำงานอยู่จะแสดงรายการบนหน้าเว็บ
ข้างต้นเป็นการแนะนำแอปพลิเคชันของ WMI โดยย่อ ที่จริงแล้วการทำงานของออบเจ็กต์ WMI นั้นซับซ้อนมากและฟังก์ชันต่างๆ ก็มีประสิทธิภาพมากเช่นกัน ตัวอย่างเช่น คุณสามารถใช้ WMI เพื่อตรวจสอบคอมพิวเตอร์บน LAN ทั้งหมดบนเซิร์ฟเวอร์และติดตั้งซอฟต์แวร์ใน แบทช์ไปยังคอมพิวเตอร์บน LAN (เช่นซอฟต์แวร์ป้องกันไวรัส) เข้าถึงเซิร์ฟเวอร์จากระยะไกลผ่านเพจ ควบคุมเซิร์ฟเวอร์ให้รันโปรแกรม เพิ่มผู้ใช้ ฯลฯ สำหรับแอปพลิเคชัน WMI เพิ่มเติม ผู้อ่านสามารถเยี่ยมชมโฮมเพจการพัฒนา WMI บน MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
รับข้อมูลเพิ่มเติม
-