ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 6137|ตอบกลับ: 1

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

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583



สำหรับ 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 เป็น ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: http://www.facebook.com/g2gnet (For Thailand only)
  6. ' / Facebook: http://www.facebook.com/CommonIndy (Worldwide)
  7. ' / Purpose: Get Serial Number of USB Flash Drive with WMI (Windows Management Instrumentation).
  8. ' / Microsoft Visual Basic .NET (2010)
  9. ' /
  10. ' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
  11. ' / You can modify and/or distribute without to inform the developer.
  12. ' / --------------------------------------------------------------------------------

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

  15. Public Class frmWMISerialUSBFlash

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

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

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

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

  69.     End Sub
  70. End Class
คัดลอกไปที่คลิปบอร์ด

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

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

4

กระทู้

15

โพสต์

251

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
251
โพสต์ 2018-4-30 15:33:52 จากอุปกรณ์พกพา | ดูโพสต์ทั้งหมด

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

0

กระทู้

51

โพสต์

232

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
232
โพสต์ 2018-5-3 09:31:31 | ดูโพสต์ทั้งหมด

ขอบพะคุณอย่างสูงครับ อาจารย์
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 21:34 , Processed in 0.263308 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้