21 มกราคม 2554

VB.Net WMI สร้างคลาสแสดงรายละเอียดของคอมพิวเตอร์กับ WIN32

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 ความคิดเห็น:

bs5221243002 กล่าวว่า...

ผมลองใส่ของ BIOSVersion[ ] ในส่วนของ WIN32_BIOS มันขึ้นตรง [ ] ว่า Identifier Expected อะครับ
ลองเอา [ ] ออก ก็ไม่Error แต่มันไม่ขึ้นค่าของข้อมูลอะครับ
มันแสดงในช่องของ BIOSVersion : System.String[ ]
ไม่ทราบว่าจะต้องแก้ในส่วนนี้ให้มันเห็น BIOSVersion ยังไงครับ

เกษม กมลชัยพิสิฐ กล่าวว่า...

1. ให้เอาวงเล็บ []
2. ตรวจดู ตัวแปร และ property ว่าถูกต้องหรือไม่
3. ดูค่าที่ SELECT

วาซาบิ กล่าวว่า...

ถ้าจะนำ Win32 Classes ไปใช้ใน C จะต้องทำอย่างไรครับ เพื่อที่จะนำค่าอุณหภูมิของ CPU ออกมา

ไม่ระบุชื่อ กล่าวว่า...

ถ้าจะนำ win32 มาใช้ใน C#.net จะสามารถ เก็บค่าของอุณหภูมิของCPUและสามารถ ตรวจสอบserviceที่เปิดอยู่ ได้รึป่าว ครับ

ไม่ระบุชื่อ กล่าวว่า...

ถ้าจะเขียนให้ไปดึงค่าจากคอมพิวเตอร์เครื่องต้องทำยังไงคับ

"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.