WMIでハードディスクのシリアルナンバーを取得するには


しも  2011-12-27 16:31:26  No: 103182  IP: 192.*.*.*

現在以下の様にして、WMIでハードディスクの情報を取得していますが、
------------------------------------------------
Dim DiskSet As SWbemObjectSet
Dim Disk As SWbemObject
Dim Locator As SWbemLocator
Dim Service As SWbemServices
Dim MesStr As String

Set Locator = New WbemScripting.SWbemLocator
Set Service = Locator.ConnectServer

Set DiskSet = Service.ExecQuery _
("Select * From Win32_DiskDrive")

For Each Disk In DiskSet

MesStr = MesStr & vbCrLf & _
"Diskの名前:" & Disk.Caption & vbCrLf & _
"DiskのデバイスID:" & Disk.DeviceID & vbCrLf & _
"Diskのインターフェース:" & Disk.InterfaceType & vbCrLf & _
"Diskのタイプ:" & Disk.MediaType & vbCrLf & _
"Diskのサイズ:" & CStr(Disk.Size) & vbCrLf & _
"Diskのステータス:" & Disk.Status & vbCrLf & _
"Diskのシリアルナンバ:" & Disk.VolumeSerialNumber

Next

MsgBox "Diskの色々な情報です。" & _
vbCrLf & MesStr & vbCrLf & "ですよ。"

Set DiskSet = Nothing
Set Disk = Nothing
Set Locator = Nothing
Set Service = Nothing
------------------------------------------------
Disk.VolumeSerialNumberのところだけ上手く行きません。何処を直したらよいでしょうか?

編集 削除
魔界の仮面弁士  2011-12-27 18:22:37  No: 103183  IP: 192.*.*.*

WMI のリファレンスを見てみましたが、Win32_DiskDrive クラスには
VolumeSerialNumber プロパティが見当たらないようです。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394132.aspx

Win32_DiskDrive となると、SerialNumber プロパティならば
ありますが、VolumeSerialNumber プロパティが使えるというのは、
どこから得た情報でしょうか?


> Disk.VolumeSerialNumberのところだけ上手く行きません。

もしも(SerialNumber ではなく)VolumeSerialNumber を得たいのであれば、
物理ドライブ(Win32_DiskDrive クラス)からではなく、
論理ドライブ(Win32_LogicalDisk や Win32_CDROMDrive 等)を
使うことになります。

編集 削除
しも  2011-12-27 21:11:22  No: 103184  IP: 192.*.*.*

たしかにSerialNumberプロパティは有りますね。

>VolumeSerialNumber プロパティが使えるというのは
これはネットで検索して、vbではなく少し違ったのですが、使えるかと
思って試してみました。

Disk.SerialNumberと直したのですが、同じエラーが出ますね。サポートしていないんですかね。

編集 削除
魔界の仮面弁士  2011-12-28 09:04:12  No: 103185  IP: 192.*.*.*

> Disk.SerialNumberと直したのですが、同じエラーが出ますね。
こちらではシリアルを取得できました。

> サポートしていないんですかね。
Properties_ を列挙して、そのクラスがサポートしている
プロパティの一覧を調べてみてください。

編集 削除
しも  2012-01-02 21:13:09  No: 103186  IP: 192.*.*.*

新年あけましておめでとう御座います。

>Properties_ を列挙して、そのクラスがサポートしている
>プロパティの一覧を調べてみてください。
すいません。色々試しましたが、プロパティが列挙出来ません。
すいませんが、コードを教えて頂けないでしょうか?

魔界様が取得出来たなら、SerialNumberプロパティが必ず出てくるはずですよね。

編集 削除
魔界の仮面弁士  2012-01-05 11:30:04  No: 103187  IP: 192.*.*.*

>> Disk.SerialNumberと直したのですが、同じエラーが出ますね。
> こちらではシリアルを取得できました。
手元の環境では
  Debug.Print Disk.DeviceID       '「\\.\PHYSICALDRIVE0」
  Debug.Print Disk.Model          '「Hitachi HDS721010CLA SCSI Disk Device」
  Debug.Print Disk.SerialNumber   '「      JP2940HZ3PXR9C」
などが返されました。
ハードウェア環境等によっては Null が返されることもあるかと思います。



>> Properties_ を列挙して、そのクラスがサポートしている
>> プロパティの一覧を調べてみてください。
> すいません。色々試しましたが、プロパティが列挙出来ません。
今回のコードで言うと、Disk.Caption という記述では、
実際には Disk.Properties_("Caption").Value に相当する処理が行われます。

Properties_ から返される SWbemPropertySet 型は、
SWbemProperty のコレクションであり、For Each で列挙可能です。

たとえば、プロパティの名前をすべて列挙する場合には

Dim p AS Object
For Each obj In DiskSet
    For Each p In obj.Properties_
        Debug.Print p.Name
    Next
    Exit For
Next

という感じです。


> すいませんが、コードを教えて頂けないでしょうか?
プロパティ名だけでなく、値も一緒に取得するのであればこんな感じです。
エラーチェックは省いてありますし、データ型の調査コードも手抜きですが。

Dim obj As SWbemObject
Dim p As SWbemProperty
Dim v As Variant
For Each obj In DiskSet
    Debug.Print "-----"
    For Each p In obj.Properties_
        '★プロパティ名を取得
        Debug.Print p.Name;

        '★データ型を調べる
        Select Case p.CIMType
            Case wbemCimtypeString
                Debug.Print "[Type:String]";
            Case wbemCimtypeUint16
                Debug.Print "[Type:UInt16]";
            Case wbemCimtypeUint32
                Debug.Print "[Type:UInt32]";
            Case wbemCimtypeUint64
                Debug.Print "[Type:UInt64]";
        End Select

        '★プロパティ値を出力
        Debug.Print "=";
        If p.IsArray Then
            Debug.Print "(配列:";
            If IsNull(p.Value) Then
                Debug.Print "Null)"
            Else
                Debug.Print LBound(p.Value); " To "; UBound(p.Value); ")"
                For Each v In p.Value
                    Debug.Print , v
                Next
            End If
        Else
            Debug.Print p.Value
        End If

    Next
Next


> 魔界様が取得出来たなら、SerialNumberプロパティが必ず出てくるはずですよね。
http://yaplog.jp/orator/archive/20

編集 削除
しも  2012-01-07 00:15:07  No: 103188  IP: 192.*.*.*

魔界の仮面弁士さん

一応プロパティは取得出来ましたが、内容がまだ把握しきれていないので、
また、後で質問し様と思います。よろしくお願いします。

編集 削除