|
สำหรับ 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. วนลูปเพื่อหาความยาวข้อมูลในแต่ละชุดข้อมูลว่า ชุดไหนที่มีความยาวมากที่สุด อันนั้นนั่นแหละคือคำตอบ ในจุดนี้เองที่คลาสสิคอย่างมาก เพราะมันคือกระบวนการคิดระดับขั้นพื้นฐาน ...
ต้อง 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) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|