WMI หรือ Windows Management Instrumentation เป็นตัวจัดการโครงสร้างข้อมูลพื้นฐานและการดำเนินงานต่าง ๆ ภายใต้ระบบบฎิบัติการวินโดวส์ หรือเรียกง่ายๆ มันคือคลาสที่ใช้จัดการทุกเรื่องของวินโดวส์ สำหรับบทความนี้จะนำเสนอเสี้ยวหนึ่งของ WMI ที่เกี่ยวข้องกับ WIN32 โดยจะยกตัวอย่างโปรแกรม แสดงรายละเอียดต่าง ๆ ของระบบปฎิบัติการ และคอมพิวเตอร์ (hardware)
1. เปิด Visual Studio 20xx จากนั้นคลิกเลือก New Project....
เลือก Visual Basic -> Windows -> Windows Forms Application
ที่ช่อง Name ป้อน mySysInfo
2. จากนั้นให้เพิ่มคอนโทรล Button กับ Textbox ลงใน Form1 ดังภาพ
3. จากนั้นทำการเพิ่ม Reference สำหรับ WMI โดยไปที่เมนู Project -> Add Reference...
จะปรากฎหน้าจอดังภาพด้านล่าง
ให้เลือก System.Management แล้วคลิกปุ่ม OK
4. ทำการสร้างคลาส โดยไปที่เมนู Project -> Add New Item...จากนั้นคลิกเลือก Class ที่ช่อง Name ป้อนชื่อโปรแกรม myWMI.vb
5. ที่หน้าจอเขียนโปรแกรม myWMI.vb ให้ป้อนคำสั่งตามตัวอย่างด้านล่าง
Imports System.Management
Public Class myWMI
Private objOS As ManagementObjectSearcher
Private objCS As ManagementObjectSearcher
Private m_strComputerName As String
Private m_strManufacturer As String
Private m_StrModel As String
Private m_strOSName As String
Private m_strOSVersion As String
Private m_strSystemType As String
Private m_strTPM As String
Private m_strWindowsDir As String
Public Sub New()
Dim objMgmt As ManagementObject
objOS = New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
objCS = New ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem")
For Each objMgmt In objOS.Get
m_strOSName = objMgmt("name").ToString()
m_strOSVersion = objMgmt("version").ToString()
m_strComputerName = objMgmt("csname").ToString()
m_strWindowsDir = objMgmt("windowsdirectory").ToString()
Next
For Each objMgmt In objCS.Get
m_strManufacturer = objMgmt("manufacturer").ToString()
m_StrModel = objMgmt("model").ToString()
m_strSystemType = objMgmt("systemtype").ToString
m_strTPM = objMgmt("totalphysicalmemory").ToString()
Next
End Sub
Public ReadOnly Property ComputerName()
Get
ComputerName = m_strComputerName
End Get
End Property
Public ReadOnly Property Manufacturer()
Get
Manufacturer = m_strManufacturer
End Get
End Property
Public ReadOnly Property Model()
Get
Model = m_StrModel
End Get
End Property
Public ReadOnly Property OsName()
Get
OsName = m_strOSName
End Get
End Property
Public ReadOnly Property OSVersion()
Get
OSVersion = m_strOSVersion
End Get
End Property
Public ReadOnly Property SystemType()
Get
SystemType = m_strSystemType
End Get
End Property
Public ReadOnly Property TotalPhysicalMemory()
Get
TotalPhysicalMemory = m_strTPM
End Get
End Property
Public ReadOnly Property WindowsDirectory()
Get
WindowsDirectory = m_strWindowsDir
End Get
End Property
End Class
6. จากนั้นย้อนกลับไปยังหน้าจอ Form1 ให้ Double Click ที่ปุ่ม Button1 เพื่อเข้าไปเขียนคำสั่ง จากนั้นให้ป้อนคำสั่งดังนี้
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim SHOW_SPEC As New myWMI
With SHOW_SPEC
TextBox1.Text = "COMPUTER NAME : " & .ComputerName & vbCrLf & _
"MODEL : " & .Model & vbCrLf & _
"MANUFACTURER : " & .Manufacturer & vbCrLf & _
"SYSTEM TYPE : " & .SystemType & vbCrLf & _
"OS : " & .OsName & vbCrLf & _
"OS VERSION : " & .OSVersion & vbCrLf & _
"WINDOWS DIRECTORY : " & .WindowsDirectory & vbCrLf & _
"TOTAL MEMORY : " & .TotalPhysicalMemory
End With
End Sub
End Class
7. ทำการบันทึกแล้วกดปุ่ม F5 เพื่อสั่งรันโปรแกรม จะปรากฎฟอร์ม ให้คลิกปุ่ม Button1 จะแสดงรายละเอียดของเครื่องลักษณะดังภาพ
จริง ๆ รายละเอียดต่าง ๆ ที่แสดงอยู่ ยังไม่หมดเพียงเท่านี้ ผู้อ่านสามารถแสดงสิ่งต่าง ๆ ได้อีกมากมาย อยากรู้ให้คลิกเข้าไปดูที่ WMI Classes -> Win32 Classes
http://msdn.microsoft.com/en-us/library/aa394084%28v=VS.85%29.aspx
... อย่าเพิ่งเกาหัว และก็อย่าเพิ่งถามว่า แล้วจะใช้อย่างไร.... คำตอบมีอยู่ด้านล่างนี้แหละ
ย้อนกลับไปข้อ 5 ยังจำได้ไหมว่าเราได้สร้างคลาส myWMI.vb ดังนี้
Imports System.Management
Public Class myWMI
Private objOS As ManagementObjectSearcher ' ตัวแปร objOS สำหรับเก็บค่า OS
....
มีการสร้าง ตัวแปร property ด้วยคำสั่ง
Private m_strComputerName As String ' ตัวแปรสำหรับใช้ใน proerty ชือ ComputerName
Private m_strManufacturer As String ' ตัวแปรสำหรับใช้ใน proerty ชือ Manufacturer
.....
แล้วก็สร้าง property แบบ อ่านได้อย่างเดียวตามตัวแปรที่กำหนด
Public ReadOnly Property ComputerName()
Get
ComputerName = m_strComputerName ' ตัวแปร property ที่กำหนดไว้ก่อนหน้า
End Get
End Property
Public ReadOnly Property Manufacturer()
Get
Manufacturer = m_strManufacturer ' ตัวแปร property ที่กำหนดไว้ก่อนหน้า
End Get
End Property
จากนั้นมีการสร้าง Constructors เพื่ออ่านค่าของ WIN32 Class ที่เราต้องการ เช่น คลาส Win32_OperatingSystem
??? แล้ว Constructors มันคืออะไร มันคือ Sub New() .... End Sub
??? แล้ว Constructors เอาไว้ทำอะไร Sub New จะทำงานเองโดยอัตโนมัติเมื่อมีการสร้างวัตถุขึ้นมาจากคลาส เช่น
Dim SHOW_SPEC As New myWMI
จากคำสั่งข้างต้น Sub New()....End Sub หรือ Constructors มันจะทำงานอัตโนมัติ (ถ้ามองให้ดี ๆ คล้าย ๆ กับ Form -> Load ที่เกิดขึ้นอัตโนมัติตอนเปิดฟอร์ม)
ดังนั้น เมื่อเราต้องการดึงค่า WIN32_OperatingSystem หรือค่า WIN32 อื่น ๆ เราจึงต้องทำใน Constructors นี้ .... เข้าใจหรือยังครับ....
จากตัวอย่าง
Public Sub New()
Dim objMgmt As ManagementObject
objOS = New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
objCS = New ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem")
For Each objMgmt In objOS.Get
m_strOSName = objMgmt("name").ToString()
m_strOSVersion = objMgmt("version").ToString()
m_strComputerName = objMgmt("csname").ToString()
m_strWindowsDir = objMgmt("windowsdirectory").ToString()
Next
.....
.....
End Sub
คำสั่งข้างต้นจะมีการอ่านค่าแล้วมาเก็บไว้ใน property ที่สร้างเตรียมไว้แล้ว
แล้ว SELECT * FROM Win32_OperatingSystem มาได้อย่างไร
จริงๆ มันคือการคิวรี ค่าจากคลาส Win32 ในส่วนของ OperatingSystem
แล้วถ้าเป็นคลาสอื่นล่ะจะไปหามาจากไหนได้อย่างไร
หาไม่ยาก ก็อยู่ใน MSDN ของ Microsoft ที่ผู้เขียนแสดงชื่อ web ไว้ให้แล้ว
เช่น เราต้องการดู BIOS จะทำอย่างไร ก็เข้าไปที่ MSDN ของ Microsoft ในส่วนของ Win32_BIOS
http://msdn.microsoft.com/en-us/library/aa394077%28v=VS.85%29.aspx
คลิกแล้วจะแสดงหน้าตาดังภาพ
ถ้าเราต้องการดู SerialNumber ของ BIOS ตามลูกศรชี เราจะต้อง
1. สร้างตัวแปรสำหรับเก็บค่าของคิวรี SELECT ...
Private objBIOS As ManagementObjectSearcher
จากนั้นก็สั่งคิวรีข้อมูลจาก คลาส Win32_BIOS ชื่อจะตรงกับคลาสที่เราเปิดดูใน MSDN
objBIOS = New ManagementObjectSearcher("SELECT * FROM Win32_BIOS")
2. สร้างตัวแปร property ดังนี้
Private m_strBIOSSerialNumber As String ' ประเภทของข้อมูลต้องตรงกัน
3. อ่านค่าจาก objBIOS ซึ่งได้คิวรีข้อมูลมาจาก Win32_BIOS
For Each objMgmt In objBIOS.Get
m_strBIOSSerialNumber = objMgmt("SerialNumber").ToString()
Next
' SerialNumber ชื่อจะตรงกับค่าที่แสดงอยู่ใน MSDN
4. สร้าง property ดังนี้
Public ReadOnly Property BIOSSerialNumber()
Get
BIOSSerialNumber = m_strBIOSSerialNumber
End Get
End Property
มาถึงตรงนี้เราคงได้วิธีทำอะไรอื่น ๆ อีกมากมาย
ถ้าอยากรู้ Serial Number ของ Harddisk ก็ไม่ยากแล้วใช่หรือไม่ ....
อยากรู้อะไร WIN32 ทำได้หมด ถามถึงหวย ก็บอกได้จะเอาเบอร์อะไร
:-p
5 ความคิดเห็น:
ผมลองใส่ของ BIOSVersion[ ] ในส่วนของ WIN32_BIOS มันขึ้นตรง [ ] ว่า Identifier Expected อะครับ
ลองเอา [ ] ออก ก็ไม่Error แต่มันไม่ขึ้นค่าของข้อมูลอะครับ
มันแสดงในช่องของ BIOSVersion : System.String[ ]
ไม่ทราบว่าจะต้องแก้ในส่วนนี้ให้มันเห็น BIOSVersion ยังไงครับ
1. ให้เอาวงเล็บ []
2. ตรวจดู ตัวแปร และ property ว่าถูกต้องหรือไม่
3. ดูค่าที่ SELECT
ถ้าจะนำ Win32 Classes ไปใช้ใน C จะต้องทำอย่างไรครับ เพื่อที่จะนำค่าอุณหภูมิของ CPU ออกมา
ถ้าจะนำ win32 มาใช้ใน C#.net จะสามารถ เก็บค่าของอุณหภูมิของCPUและสามารถ ตรวจสอบserviceที่เปิดอยู่ ได้รึป่าว ครับ
ถ้าจะเขียนให้ไปดึงค่าจากคอมพิวเตอร์เครื่องต้องทำยังไงคับ
แสดงความคิดเห็น