supermab.com   HOME > USBメモリのシリアル番号を調べる > USBメモリのシリアル番号を調べる方法

USBメモリのシリアル番号を調べる方法について、ネット上の情報が分散していて判りにくいので、
「みかん」で利用している方法についての技術情報をまとめておきます。

【 システム情報から見る 】
【 WMI とは?】
【 VBA で使う 】
【 C# で使う 】
【 PCに接続されたUSBメモリの履歴を取得する 】

【システム情報から見る】

USBメモリのシリアルナンバー(DeviceID)を知りたい場合、
[スタート]→[プログラム]→[アクセサリ]→[システムツール]→[システム情報] を開き、
システムの概要(左ペイン)の、コンポーネントにある「USB」をクリックすると、
PC に接続されているUSB機器の一覧が表示されます。
USBメモリを挿入した状態であれば、一覧中に
「USB大容量記憶装置デバイス」 というデバイス名のものがあるはずです。
そのデバイスの右側に、PNP デバイスID が、
[USB¥VID_xxxx&PID_xxxx¥xxxxxxxxxxxxx ] のように表示されます。

TOPへ


【WMI とは?】

さて、上記のようにUSBメモリのシリアルを表示できるのですから、プログラムからも情報を取得できるはずです。
Windows にはその手段が用意されています。Windows Management Instrumentation (以下=WMI) がそれです。

WMI は 1998 年に Windows NTR 4.0 Service Pack 4 のアドオン コンポーネントとして最初にリリースされた、管理のための中核的なテクノロジで、Windows 2000、Windows XP、および Windows Server 2003 ファミリの各オペレーティング システムに組み込まれています。WMI は Distributed Management Task Force (DMTF) が監視する業界標準に基づいており、すべての (ほとんどすべての) Windows リソースへのアクセス、構成、管理、および監視を可能にする管理基盤です。


WMI についての詳細はこちら をご覧ください。

TOPへ


【VBA で使う】

WMI は、ほとんどすべてのWindowsリソースにアクセスできる事がわかりました。スクリプトによる方法は Scripting Guys に任せるとして、
ここでは、ExcelVBA を使ってUSBメモリのシリアル番号を取得してみます。
たとえば、Excel のシート上に、「PC に接続されているUSBメモリのIDを列挙する」VBA コードは下記のようになります。

Public Sub GetUSBSerial()
Dim WMI, Collection, Item
Dim str() As String
Dim i As Integer
 i = 1

 Set WMI = GetObject("winmgmts: ¥ ¥ ." & " ¥ root ¥ CIMV2")
 Set Collection = WMI.ExecQuery("SELECT * FROM Win32_DiskDrive", , 48)  'ディスクドライブを抽出

 For Each Item In Collection  'すべてのディスクドライブのうち
   If Item.InterfaceType = "USB" Then  'インターフェイスタイプがUSBのものについて
     str = Split(Item.PNPDeviceID, " ¥ ")
     str = Split(str(UBound(str)), " & ")
     Sheet1.Cells(i, 1).Value = "Caption = " & Item.Caption
     Sheet1.Cells(i + 1, 1).Value = "SerialNo.= " & str(0)
     i = i + 2
   End If
 Next
 If i = 1 Then MsgBox "USBドライブが見つかりません"
End Sub

TOPへ


【C# で使う】

C# および VB.Net から WMI を利用する場合は、Microsoft が無償配布している 「WMICodeCreator」というツールが便利です。
 (WMICodeCreatorのダウンロードは こちら )

このツールを使うと、Windows の管理情報の中から、選択した項目についてWMI に問い合わせるコードを自動生成してくれます。
たとえば、USBデバイスのIDを取得するコードを CodeLanguage に C# を指定して生成すると下記のようになります。

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
  public class MyWMIQuery
  {
    public static void Main()
    {
      try
      {
        ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2",
        "SELECT * FROM Win32_USBController");
        
        foreach (ManagementObject queryObj in searcher.Get())
        {
          Console.WriteLine("-----------------------------------");
          Console.WriteLine("Win32_USBController instance");
          Console.WriteLine("-----------------------------------");
          Console.WriteLine("DeviceID: {0}", queryObj["DeviceID"]);
        }
      }
      catch (ManagementException e)
      {
        MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
      }
    }
  }
}

こんな感じで、クラスとプロパティーを選択したら勝手に生成コードが表示されます ↓

WMIのイメージ

TOPへ


【PCに接続されたUSBメモリの履歴を取得する】

PC に接続されたUSBメモリはレジストリに履歴が保存されます。
PCに接続されたUSBメモリの履歴をレジストリから取得する方法について、ブログに記事をUPしました。 ⇒ こちら

TOPへ

HOMEへ  

Copyright © 2008-2011 supermab.com
All rights reserved.