|
บทความนี้ก็จะคล้ายๆกับเรื่อง Device Watcher ที่แอดมินจะกล่าวถึงต่อไปในตอนหน้า คือเป็นการดักหรือตรวจสอบ USB Flash Drive ที่เสียบอยู่กับเครื่องคอมพิวเตอร์ เพื่อทำการอ่านค่า Drive Letter, Model และหมายเลข Serial Number ด้วยการตั้งค่าเวลาในการดักตรวจสอบระดับวินาที ...
อย่าลืม Add Reference System.Management ก่อนการใช้งาน WMI (Windows Management Instrumentation) ทุกครั้ง ...
มาดูโค้ด VB.NET กันเถอะ ...
- ' / --------------------------------------------------------------------------------
- ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
- ' / eMail : thongkorn@hotmail.com
- ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
- ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
- ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
- ' / MORE: http://www.g2gnet.com/webboard
- ' /
- ' / Purpose: Detect USB Flash Drive with WMI (Windows Management Instrumental)
- ' / 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 add --> Reference --> System.Management
- Imports System.Management
- Public Class frmDetectUSBFlashDrive
- Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- Timer1.Enabled = True
- For i As Byte = 0 To 60
- cmbTimer.Items.Add(i)
- Next
- cmbTimer.SelectedIndex = 5 ' 5 Second
- Timer1.Interval = Val(cmbTimer.Text) * 1000
- '// Start
- Call ReadUsbFlashSerialNo()
- End Sub
- ' / --------------------------------------------------------------------------------
- ' / Function to read Usb Flash Serial Number (Not Volume) and return value all drives.
- Sub ReadUsbFlashSerialNo()
- Dim strTemp As String = ""
- Dim strSerial As String = ""
- Dim strArr() As String
- Dim MaxLen As Byte = 0
- Dim idx As Byte = 0
- ' Initialize ListView Control
- With lvwData
- .View = View.Details
- .GridLines = True
- .FullRowSelect = True
- .HideSelection = False
- .MultiSelect = False
- .Columns.Add("Drive", lvwData.Width \ 3 - 130)
- .Columns.Add("Model", lvwData.Width \ 3 + 60)
- .Columns.Add("Physical Serial Number", lvwData.Width \ 3 + 40)
- End With
- Dim LV As ListViewItem
- Try
- ' Windows Query Language หรือ WQL "Win32_DiskDrive"
- Dim WmiQuery As String = "SELECT * FROM " & "Win32_DiskDrive"
- Dim WmiSearcher As New ManagementObjectSearcher(WmiQuery)
- For Each info As ManagementObject In WmiSearcher.Get()
- If info("InterfaceType") = "USB" Then
- Dim strModel As String = (String.Format("{0}", info("Model")))
- strTemp = (String.Format("{0}", info("PnPDeviceID")))
- '// หาเครื่องหมาย \ ตัวแรก แต่เป็นการนับมาจากทางขวาด้วยคำสั่ง InStrRev (InStr จะนับจากทางซ้ายมาขวา)
- '// เช่น "USBSTOR\DISK&VEN_&PROD_&REV_1.00\7&15FF80F3&0&__&0" <-- เจอหน้าเลข 7
- strTemp = Mid(strTemp, InStrRev(strTemp, "") + 1, Len(strTemp) - InStrRev(strTemp, "") + 1)
- '// ก็จะได้ "7&15FF80F3&0&__&0"
- '// แยกชุดข้อมูลออกจากกันด้วยเครื่องหมาย &
- strArr = strTemp.Split("&")
- '//
- For Count As Byte = 0 To strArr.Length - 1
- '// หาความยาวสูงสุด เพราะนั่นแหละคือ Serial Number
- If MaxLen < Len(strArr(Count)) Then
- '// เก็บค่า Index เป็นคำตอบ
- idx = Count
- '// นำค่าความยาวมากที่สุดกลับไปเปรียบเทียบใหม่
- MaxLen = Len(strArr(Count))
- End If
- Next
- '// Put them into ListView Control.
- '// Drive Letter
- LV = lvwData.Items.Add(GetDriveLetterFromDisk(String.Format("{0}", info("Name"))))
- '// Model
- LV.SubItems.Add(Trim(strModel))
- '// Physical Serial Number
- LV.SubItems.Add(Replace(Trim(strArr(idx)), Chr(0), ""))
- End If
- Next
- Catch err As ManagementException
- MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
- End Try
- End Sub
- ' / --------------------------------------------------------------------------------
- ' / Function to read Usb Flash Drive Letter.
- Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
- Dim qPart, qDisk As ObjectQuery
- Dim mPart, mDisk As ManagementObjectSearcher
- Dim objPart, objDisk As ManagementObject
- Dim DriveLetter As String = ""
- ' WMI queries use the "" as an escape charcter
- Name = Replace(Name, "", "\")
- ' First we map the Win32_DiskDrive instance with the association called
- ' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
- ' instance with the assocation called Win32_LogicalDiskToPartition
- qPart = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & Name & """} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
- mPart = New ManagementObjectSearcher(qPart)
- For Each objPart In mPart.Get()
- qDisk = New ObjectQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & objPart("DeviceID").ToString & """} WHERE AssocClass = Win32_LogicalDiskToPartition")
- mDisk = New ManagementObjectSearcher(qDisk)
- For Each objDisk In mDisk.Get()
- DriveLetter &= objDisk("Name").ToString
- Next
- Next
- Return DriveLetter
- End Function
- ' / --------------------------------------------------------------------------------
- ' / Timer for trigger.
- Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
- lvwData.Clear()
- ReadUsbFlashSerialNo()
- End Sub
- Private Sub cmbTimer_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbTimer.SelectedIndexChanged
- If Val(cmbTimer.Text) <> 0 Then
- Timer1.Enabled = True
- '// Multiply by 1000 ms.
- Timer1.Interval = Val(cmbTimer.Text) * 1000
- Else
- Timer1.Enabled = False
- End If
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|