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

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

[VB.NET] การตรวจจับ USB Flash Drive แบบอัตโนมัติตามค่าเวลาที่ตั้งไว้ด้วย WMI

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

308

กระทู้

498

โพสต์

5971

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
5971



บทความนี้ก็จะคล้ายๆกับเรื่อง Device Watcher ที่แอดมินจะกล่าวถึงต่อไปในตอนหน้า คือเป็นการดักหรือตรวจสอบ USB Flash Drive ที่เสียบอยู่กับเครื่องคอมพิวเตอร์ เพื่อทำการอ่านค่า Drive Letter, Model และหมายเลข Serial Number ด้วยการตั้งค่าเวลาในการดักตรวจสอบระดับวินาที ...


อย่าลืม Add Reference System.Management ก่อนการใช้งาน WMI (Windows Management Instrumentation) ทุกครั้ง ...

มาดูโค้ด VB.NET กันเถอะ ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / MORE: http://www.g2gnet.com/webboard
  8. ' /
  9. ' / Purpose: Detect USB Flash Drive with WMI (Windows Management Instrumental)
  10. ' / Microsoft Visual Basic .NET (2010)
  11. ' /
  12. ' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
  13. ' / You can modify and/or distribute without to inform the developer.
  14. ' / --------------------------------------------------------------------------------

  15. '// Don't forget add --> Reference --> System.Management
  16. Imports System.Management

  17. Public Class frmDetectUSBFlashDrive

  18.     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  19.         Timer1.Enabled = True
  20.         For i As Byte = 0 To 60
  21.             cmbTimer.Items.Add(i)
  22.         Next
  23.         cmbTimer.SelectedIndex = 5    ' 5 Second
  24.         Timer1.Interval = Val(cmbTimer.Text) * 1000
  25.         '// Start
  26.         Call ReadUsbFlashSerialNo()
  27.     End Sub

  28.     ' / --------------------------------------------------------------------------------
  29.     ' / Function to read Usb Flash Serial Number (Not Volume) and return value all drives.
  30.     Sub ReadUsbFlashSerialNo()
  31.         Dim strTemp As String = ""
  32.         Dim strSerial As String = ""
  33.         Dim strArr() As String
  34.         Dim MaxLen As Byte = 0
  35.         Dim idx As Byte = 0
  36.         ' Initialize ListView Control
  37.         With lvwData
  38.             .View = View.Details
  39.             .GridLines = True
  40.             .FullRowSelect = True
  41.             .HideSelection = False
  42.             .MultiSelect = False
  43.             .Columns.Add("Drive", lvwData.Width \ 3 - 130)
  44.             .Columns.Add("Model", lvwData.Width \ 3 + 60)
  45.             .Columns.Add("Physical Serial Number", lvwData.Width \ 3 + 40)
  46.         End With
  47.         Dim LV As ListViewItem
  48.         Try
  49.             ' Windows Query Language หรือ WQL "Win32_DiskDrive"
  50.             Dim WmiQuery As String = "SELECT * FROM " & "Win32_DiskDrive"
  51.             Dim WmiSearcher As New ManagementObjectSearcher(WmiQuery)
  52.             For Each info As ManagementObject In WmiSearcher.Get()
  53.                 If info("InterfaceType") = "USB" Then
  54.                     Dim strModel As String = (String.Format("{0}", info("Model")))
  55.                     strTemp = (String.Format("{0}", info("PnPDeviceID")))
  56.                     '// หาเครื่องหมาย \ ตัวแรก แต่เป็นการนับมาจากทางขวาด้วยคำสั่ง InStrRev (InStr จะนับจากทางซ้ายมาขวา)
  57.                     '// เช่น "USBSTOR\DISK&VEN_&PROD_&REV_1.00\7&15FF80F3&0&__&0" <-- เจอหน้าเลข 7
  58.                     strTemp = Mid(strTemp, InStrRev(strTemp, "") + 1, Len(strTemp) - InStrRev(strTemp, "") + 1)
  59.                     '// ก็จะได้ "7&15FF80F3&0&__&0"
  60.                     '// แยกชุดข้อมูลออกจากกันด้วยเครื่องหมาย &
  61.                     strArr = strTemp.Split("&")
  62.                     '//
  63.                     For Count As Byte = 0 To strArr.Length - 1
  64.                         '// หาความยาวสูงสุด เพราะนั่นแหละคือ Serial Number
  65.                         If MaxLen < Len(strArr(Count)) Then
  66.                             '// เก็บค่า Index เป็นคำตอบ
  67.                             idx = Count
  68.                             '// นำค่าความยาวมากที่สุดกลับไปเปรียบเทียบใหม่
  69.                             MaxLen = Len(strArr(Count))
  70.                         End If
  71.                     Next
  72.                     '// Put them into ListView Control.
  73.                     '// Drive Letter
  74.                     LV = lvwData.Items.Add(GetDriveLetterFromDisk(String.Format("{0}", info("Name"))))
  75.                     '// Model
  76.                     LV.SubItems.Add(Trim(strModel))
  77.                     '// Physical Serial Number
  78.                     LV.SubItems.Add(Replace(Trim(strArr(idx)), Chr(0), ""))
  79.                 End If
  80.             Next
  81.         Catch err As ManagementException
  82.             MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
  83.         End Try
  84.     End Sub

  85.     ' / --------------------------------------------------------------------------------
  86.     ' / Function to read Usb Flash Drive Letter.
  87.     Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
  88.         Dim qPart, qDisk As ObjectQuery
  89.         Dim mPart, mDisk As ManagementObjectSearcher
  90.         Dim objPart, objDisk As ManagementObject
  91.         Dim DriveLetter As String = ""
  92.         ' WMI queries use the "" as an escape charcter
  93.         Name = Replace(Name, "", "\")
  94.         ' First we map the Win32_DiskDrive instance with the association called
  95.         ' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
  96.         ' instance with the assocation called Win32_LogicalDiskToPartition
  97.         qPart = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & Name & """} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
  98.         mPart = New ManagementObjectSearcher(qPart)
  99.         For Each objPart In mPart.Get()
  100.             qDisk = New ObjectQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & objPart("DeviceID").ToString & """} WHERE AssocClass = Win32_LogicalDiskToPartition")
  101.             mDisk = New ManagementObjectSearcher(qDisk)
  102.             For Each objDisk In mDisk.Get()
  103.                 DriveLetter &= objDisk("Name").ToString
  104.             Next
  105.         Next
  106.         Return DriveLetter
  107.     End Function

  108.     ' / --------------------------------------------------------------------------------
  109.     ' / Timer for trigger.
  110.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  111.         lvwData.Clear()
  112.         ReadUsbFlashSerialNo()
  113.     End Sub

  114.     Private Sub cmbTimer_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbTimer.SelectedIndexChanged
  115.         If Val(cmbTimer.Text) <> 0 Then
  116.             Timer1.Enabled = True
  117.             '// Multiply by 1000 ms.
  118.             Timer1.Interval = Val(cmbTimer.Text) * 1000
  119.         Else
  120.             Timer1.Enabled = False
  121.         End If
  122.     End Sub
  123. End Class
คัดลอกไปที่คลิปบอร์ด

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

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

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

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

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

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

GMT+7, 2024-3-29 00:57 , Processed in 0.262239 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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