thongkorn โพสต์ 2018-4-30 14:10:08

[VB.NET] การอ่านค่า Serial Number ของ USB Flash Drive ด้วย WMI

http://www.g2gnet.com/webboard/images/vbnet/USBFlashDriveSN.png

สำหรับ WMI หรือ Windows Management Instrumentation ซึ่งแอดมินขอสรุปให้ฟังง่ายๆก่อนว่า มันเป็นส่วนที่สามารถดึงรายละเอียดทุกๆอย่างของตัวระบบปฏิบัติการWindows ออกมาทั้งด้านฮาร์ดแวร์และซอฟท์แวร์ เพื่อการแสดงผล หรือควบคุมได้ทั้งหมด ... ซึ่งก่อนหน้าที่ย้าย Hosting มาใหม่ แอดมินก็ได้เคยร่ายรายละเอียดให้ฟังไปเยอะ แต่ยังไม่ได้เอามาลงใหม่ ดังนั้นจึงขอข้ามส่วน WMI ไปก่อน สำหรับในบทความตอนนี้แอดมินจะขอนำเสนอ การแก้ปัญหาโจทย์ ในแบบที่เรียกได้ว่า Classic มากๆ เพราะเราจะใช้กระบวนการเรียนรู้ขั้นพื้นฐานมาแก้ปัญหาอย่างเป็นระบบ ซึ่งสามารถนำไปใช้งานได้กับภาษาระดับสูงทุกๆภาษา ...

เริ่มต้นการคิด ... แอดมินจะนำตัวอย่างจากของจริงมาให้พิจารณากันสัก 3 ชุด

"USBSTOR\DISK&VEN_&PROD_USB_DRIVE&REV_1.12\0189820091507&0"
"USBSTOR\DISK&VEN_KINGSTON&PROD_DT_101_G2&REV_PMAP\001CC0EC350DBBC0370B027E&0"
"USBSTOR\DISK&VEN_&PROD_&REV_1.00\7&15FF80F3&0&__&0"

พิจารณาดังนี้ ... ในการใช้ WMI เพื่ออ่าน Serial Number ของ USB Flash Drive ในแต่ละแถว มักจะแบ่งข้อมูลออกเป็น 3 ชุด (หรือมากกว่าก็ได้) ซึ่งจะคั่นกันด้วยเครื่องหมาย \ โดยรหัส SN (Serial Number) จะอยู่ในชุดทางขวามือสุดท้าย แต่ SN ยังถูกแยกออกจากกันด้วยเครื่องหมาย & อีกที ดังนั้นรหัส SN ที่เราต้องการ จะเป็นรหัสเลขฐาน 16 ที่มีความยาวมากที่สุด ซึ่งจะเป็นคำตอบสุดท้าย ...

วิธีการคิดแบบคลาสสิค ... โดยใช้ตัวอย่าง "USBSTOR\DISK&VEN_&PROD_&REV_1.00\7&15FF80F3&0&__&0"

1. แยกข้อมูลออกจากกันด้วยเครื่องหมาย \ และเลือกเอาชุดข้อมูลทางขวามือสุด มาใช้งานต่อไป (ส่วนอื่นตัดทิ้ง)
จะทำให้ได้ "7&15FF80F3&0&__&0"

2. แยกข้อมูลออกจากกันด้วยเครื่องหมาย & ... หากใช้ Array ก็จะทำให้ได้ผลดังต่อไปนี้
strArr(0) = "7"               '<-- LBound
strArr(1) = "15FF80F3"
strArr(2) = "0"
strArr(3) = "__"
strArr(4) = "0"               '<-- UBound

3. วนลูปเพื่อหาความยาวข้อมูลในแต่ละชุดข้อมูลว่า ชุดไหนที่มีความยาวมากที่สุด อันนั้นนั่นแหละคือคำตอบ ในจุดนี้เองที่คลาสสิคอย่างมาก เพราะมันคือกระบวนการคิดระดับขั้นพื้นฐาน ...

http://www.g2gnet.com/webboard/images/vbnet/USBFlashDriveRef.png
ต้อง Add Reference ... System.Management เข้ามาใช้งานก่อนด้วยครับ

มาดูโค้ดของจริงกันเถอะ ... จะช่วยให้ง่ายต่อการทำความเข้าใจ หากคุณใช้งาน Debugger เป็น ...
' / --------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: http://www.facebook.com/g2gnet (For Thailand only)
' / Facebook: http://www.facebook.com/CommonIndy (Worldwide)
' / Purpose: Get Serial Number of USB Flash Drive with WMI (Windows Management Instrumentation).
' / Microsoft Visual Basic .NET (2010)
' /
' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / --------------------------------------------------------------------------------

'// Don't forget to Add Reference --> System.Management
Imports System.Management

Public Class frmWMISerialUSBFlash

    Private Sub frmWMISerialUSBFlash_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      Call ReadUsbFlashSerialNo()
    End Sub

    ' / --------------------------------------------------------------------------------
    ' / Procedure to read USB Flash Serial Number (Not Volume) and return value all drives.
    Private Sub ReadUsbFlashSerialNo()
      Dim strTemp As String = ""
      Dim strArr() As String
      Dim MaxLen As Byte = 0'<-- หาค่าความยาวสูงสุดของชุดข้อมูล ซึ่งจะเป็น Serial Number
      Dim idx As Byte = 0         '<-- เป็น Index ของ Array ซึ่งจะเก็บค่าคำตอบ Serial Number
      '// Start
      Try
            '// Windows Query Language หรือ WQL "Win32_DiskDrive"
            '// เลือกมาเฉพาะ InterfaceType = 'USB'
            Dim WmiQuery As String = "SELECT * FROM Win32_DiskDrive WHERE InterfaceType = 'USB' "
            Dim WmiSearcher As New ManagementObjectSearcher(WmiQuery)

            '// ลูปหา USB Flash Drive ทั้งหมดที่กำลังถูกเสียบคาเครื่อง
            For Each info As ManagementObject In WmiSearcher.Get()
                '// รับค่า USB Storage จากการอ่านของ WMI
                ' "USBSTOR\DISK&VEN_&PROD_&REV_1.00\7&15FF80F3&0&__&0"
                strTemp = (String.Format("{0}", info("PnPDeviceID")))
                '// แยกชุดข้อมูลออกจากกันด้วยเครื่องหมาย \
                strArr = strTemp.Split("\")
                ' strArr(0) = "USBSTOR"
                ' strArr(1) = "DISK&VEN_&PROD_&REV_1.00"
                ' strArr(2) = "7&15FF80F3&0&__&0"
                '// เลือกเอาข้อมูลชุดสุดท้ายที่มี UBound สูงสุด จะได้ "7&15FF80F3&0&__&0" ซึ่งเป็นคำตอบแต่ยังไม่สุดท้าย
                strTemp = strArr(UBound(strArr))

                strArr = New String() {} ' implicit size, initialized to empty
                '// แยก "7&15FF80F3&0&__&0" ด้วยเครื่องหมาย &
                strArr = strTemp.Split("&")
                ' strArr(0) = "7"               '<-- LBound
                ' strArr(1) = "15FF80F3"
                ' strArr(2) = "0"
                ' strArr(3) = "__"
                ' strArr(4) = "0"               '<-- UBound
                '// ลูปตามจำนวน Index ของ Array โดยเริ่มจาก LBound = 0 ไปจนสิ้นสุดที่ UBound
                '// เพื่อหาช่องเก็บข้อมูลยาวที่สุด
                For Count = LBound(strArr) To UBound(strArr)
                  '// เปรียบเทียบค่าความยาวของข้อมูลในแต่ละ Array
                  If MaxLen < Len(strArr(Count)) Then
                        '// เก็บค่า Index ไว้เป็นคำตอบ (ตัวอย่างคือ Index = 1)
                        idx = Count
                        '// นำค่าความยาวที่มากกว่ามาเก็บไว้ ก่อนที่วนกลับไปเปรียบเทียบค่าใหม่
                        MaxLen = Len(strArr(Count))
                  End If
                Next
                '// นำคำตอบสุดท้ายมาแสดงผลใน ListBox
                ListBox1.Items.Add(strArr(idx))
            Next
      Catch err As ManagementException
            MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
      End Try

    End Sub
End Class
ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB.NET (2010) ได้ที่นี่ ...

mozza โพสต์ 2018-4-30 15:33:52

แจ่มไปเลยคับ ^_^

MrDen โพสต์ 2018-5-3 09:31:31

ขอบพะคุณอย่างสูงครับ อาจารย์ :)
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] การอ่านค่า Serial Number ของ USB Flash Drive ด้วย WMI