現在以下の様にして、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のところだけ上手く行きません。何処を直したらよいでしょうか?
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 等)を
使うことになります。
たしかにSerialNumberプロパティは有りますね。
>VolumeSerialNumber プロパティが使えるというのは
これはネットで検索して、vbではなく少し違ったのですが、使えるかと
思って試してみました。
Disk.SerialNumberと直したのですが、同じエラーが出ますね。サポートしていないんですかね。
> Disk.SerialNumberと直したのですが、同じエラーが出ますね。
こちらではシリアルを取得できました。
> サポートしていないんですかね。
Properties_ を列挙して、そのクラスがサポートしている
プロパティの一覧を調べてみてください。
新年あけましておめでとう御座います。
>Properties_ を列挙して、そのクラスがサポートしている
>プロパティの一覧を調べてみてください。
すいません。色々試しましたが、プロパティが列挙出来ません。
すいませんが、コードを教えて頂けないでしょうか?
魔界様が取得出来たなら、SerialNumberプロパティが必ず出てくるはずですよね。
>> 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
魔界の仮面弁士さん
一応プロパティは取得出来ましたが、内容がまだ把握しきれていないので、
また、後で質問し様と思います。よろしくお願いします。
ツイート | ![]() |