忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:USBメモリーの存在確認の方法
USBメモリーの存在確認を行うために、 PCのハードウェア情報の取得をWMI(Windows Management Instrumentation)を使います。

ManagementObjectSearcherクラスを使って、WMIの情報を取得します。
WMIにはいろいろな情報を持っていますが、それを取得するための言語WQL(WMI Query Language)を使って取得します。
SQL言語のような記述で、以下のソースの中では
「SELECT * FROM Win32_DiskDrive where InterfaceType='USB'」
の部分です。

ManagementObjectSearcherクラスのコンストラクタの第1引数のスコープの指定で、"root\cimv2"と設定します。
この"root\cimv2"はシステム管理者にとって関心のあるWMIクラスのほとんどが格納されているそうです。
(cimv2とはCommon Information Model Version 2 というらしい)

さてSELECT文の中のWin32_DiskDriveですが、 Win32_DiskDriveクラスは、Win32 オペレーティング システムを 実行しているコンピューターで見ることができる物理ディスクドライブを表すそうです。

InterfaceTypeには以下の種類があります。
・SCSI
・HDC
・IDE
USB
・1394
この中の”USB”を指定します。

''' 
''' USBメモリの存在チェック
''' 
''' <param name="strPNPDeviceID">USBメモリのPNPDeviceID文字列</param>
''' <param name="lst">USB機器を列挙情報</param>
''' True:存在する、False:存在しない
Public Function CheckExistUSB(ByVal strPNPDeviceID As String, _
                              Optional ByRef lst As Hashtable() = Nothing) As Boolean
    '戻り値初期化
    CheckExistUSB = False

    'USBメモリの存在チェック処理
    Try
        'WMI(Windows Management Instrumentation)を利用してUSBの情報を取得
        Dim searcher As New System.Management.ManagementObjectSearcher( _
            "root\CIMV2", _
            "SELECT * FROM Win32_DiskDrive where InterfaceType='USB'")

        '全てのUSB機器を列挙
        For Each queryObj As System.Management.ManagementObject In searcher.Get()
            Dim s As String = ""
            If Not lst Is Nothing Then
                'USB機器の情報をHashtableに格納
                Dim hash As New Hashtable
                hash.Add("Caption", queryObj("Caption"))
                hash.Add("DeviceID", queryObj("DeviceID"))
                hash.Add("PNPDeviceID", queryObj("PNPDeviceID"))
                'Hashtableの配列に格納
                Dim i As Integer = LBound(lst)
                If Not lst(0) Is Nothing Then
                    i += 1
                    ReDim Preserve lst(i)
                End If
                lst(i) = hash
            End If
            '指定のPNPDeviceIDが等しいかチェック
            If queryObj("PNPDeviceID") = strPNPDeviceID Then
                '指定のUSBメモリが見つかった
                CheckExistUSB = True
                Exit For
            End If
        Next

    Catch ex As System.Management.ManagementException
        MsgBox("WMI Error: " & ex.Message, MsgBoxStyle.Critical)
    End Try
End Function

''' 
''' USBをチェックするためのボタンClickイベント
''' 
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    'USB機器を列挙情報用のHashtable設定
    Dim lst As Hashtable()
    ReDim lst(0)
    'USBメモリの存在チェック(USB機器を列挙)
    Me.CheckExistUSB("", lst)

    'USB機器を列挙
    Dim str As String = ""
    For i As Integer = 0 To UBound(lst)
        If i > 0 Then str += vbCr
        For Each col As System.Collections.DictionaryEntry In lst(i)
            str &= col.Key & " : " & col.Value & vbCr
        Next
    Next
    MsgBox(str)
End Sub
尚、上記のプログラムをテストする場合に、プロジェクトの中の参照設定にSystem.Management.dllを追加する必要があります。


=====
2015/04/16:の時の情報











PR

コメント

コメントを書く