[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) ได้ที่นี่ ...
แจ่มไปเลยคับ ^_^ ขอบพะคุณอย่างสูงครับ อาจารย์ :)
หน้า:
[1]