初めまして、お世話になります。
現在、WMIを利用してパーティションごとの容量と空き容量を表示するプログラムを書いているのですが、ドライブレターの無いパーティションの容量が取得できません。
一応、
Win32_DiskPartition・Win32_Volume・Win32_LogicalDisk・Win32_LogicalDiskToPartition 等で一通りの情報を取得できるのは確認できており、ドライブレターが割り当てられているパーティションは問題ないのですが、ドライブレターが割り当てられていない場合に、関連付けられる情報が見つからない状況です。
WMI、もしくは他の手段を用いて一意に識別する方法などはありますでしょうか。
新規に HDD を追加してパーティションを作成したとします.
Win32_LogicalDisk ではドライブ文字がないドライブは認識できませんが,
Win32_Volume では Caption だか DeviceID が以下のような GUID の文字列が含まれている ハズなんですが ?
\\?\Volume{2bd6ab17-a535-11e4-93bc-xxxxxxxxxxxx}\
もしかしたら,使用している WMI の操作用のライブラリの違いかも知れません.
私が使っているのは [Microsoft WMI Scripting V1.2 Library (Version 1.2)]
から取り込んで作成した WbemScripting_TLB というユニットです.
[備考]
DeviceID の値はそのままではクエリのパラメータとして利用できません.
\ を 2 倍して以下のようにします.
\\\\?\\Volume{2bd6ab17-a535-11e4-93bc-xxxxxxxxxxxx}\\
Mr.XRAYさん、返信ありがとうございます。
また、質問内容が不十分でありましたこと、お詫び申し上げます。
まず、Win32_Volume を使用した際のGUIDは、自環境でも確認できております。
ただ、今回私が行いたいのはパーティションとボリュームの関連付けで、Win32_DiskPartitionで接続されている
ディスクのすべてのパーティション情報を取得し、その取得したパーティションに対応するボリュームの情報を
取得する方法を模索しているのですが、ドライブレターのないパーティションとWin32_Volumeで取得できるGUIDを関連付けられる
情報が見つからず、なんとかできないかと思いまして質問させていただいた次第です。
先日の質問以降、SerialNumberの値ならどうかと探してみたのですが見つからず、Mr.XRAYさんの備考のところから、
GUIDを関係のありそうなClassにクエリのパラメータとして渡してみたりもしたのですがうまくいかず、手詰まりな状況です。
WMI以外の手段でも良いので、何か方法がありましたら、ご教授いただければ幸いです。
一応下に、目的としているパーティションとボリュームの関連付けの例を記述しておきます。
---------------------------------------------------------------------------------------
ディスク #0, パーティション #0 = \\?\Volume{88c97ede-9540-40ef-a918-58749ca647dc}\
├DriveLetter : NULL
├Capacity : 523235328
└FreeSpace : 92422144
ディスク #0, パーティション #1 = \\?\Volume{a76082d1-2fe2-45f4-a866-c3615b099b54}\
├DriveLetter : NULL
├Capacity : 100663296
└FreeSpace : 74438656
ディスク #0, パーティション #2 = \\?\Volume{214afba1-79d5-4646-bf13-52b47bc8b803}\
├DriveLetter : C:
├Capacity : 239410868224
└FreeSpace : 129355776000
残念ですが,私の能力では「関連付け」の意味が理解できません.
ディスク (ストレージ) 関係でしたら関連する Windows API があります.
[ Storage Management API Classes ]
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/stormgmt/storage-management-api-classes
例えば GetDiskFreeSpaceW function ではディスクの空き容量が取得できます.
第 1 引数には C: 等のドライブ文字のかわりに Win32_Volume で取得した DeviceID も使用できます.
https://docs.microsoft.com/ja-jp/windows/desktop/api/fileapi/nf-fileapi-getdiskfreespacew
こういった Windows API の利用も考えてみてはいかがでしょうか ?
直接の回答ではありませんが、WMIを使うなら
WMI Delphi Code Creator
https://github.com/RRUZ/wmi-delphi-code-creator
を使うと幸せになれるかもしれません。
[ Storage Management API Classes ]
の API の使用方法は WMI と同じですが,名前空間が違います.
root\cimv2 ---> Root\Microsoft\Windows\Storage
この MSFT_XXXX のクラスは Windows 8 以降で使用可能ですが,
私が動作を確認しているのは Windows 7 U64(SP1) + Delphi 10.2.3 Tokyo Community です.
WMI Delphi Code Creator でもクラスの一覧,プロパティ等が確認できます.
>私が動作を確認しているのは Windows 7 U64(SP1) + Delphi 10.2.3 Tokyo Community です.
間違えました.以下です.
Windows 10.0.17134 Pro-32 bit + Delphi 10.2.3 Tokyo Community
関連付けという意味は理解できませんが,
もしかして,コンピュータに接続されている物理ドライブを知ることができれば問題の開裂につながるのでしょうか ?
でしたら,Win32\_DiskDrive クラスを確認してみてください.
[ Win32\_DiskDrive class | Microsoft Docs ]
https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-diskdrive
[ Computer System Hardware Classes - Mass Storage Classes| Microsoft Docs ]
https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/computer-system-hardware-classes#mass-storage-classes
あれ,余計な \ が入ってしまっています.
Win32\_DiskDrive ---> Win32_DiskDrive
Mr.XRAYさん、通りすがりさん、返信ありがとうございます。
質問の件ですが、無事解決することができました。
まず初めに謝らなければならないのですが、私は、WMIというものを全く理解出来ておりませんでした。
というのも、WMIの名前空間を指定する際、特に理解もせず'root\cimv2'を指定していたのですが、
これをWMIにアクセスするためのお約束的なもので、これ以外の値が指定されることはないと勝手に
思い込んでしまっていたのがそもそもの原因です。
今回、Mr.XRAYさんよりいただいた情報を元に名前空間の指定を変更することで、
まさしく、求めていた情報を取得することが出来ました。
・名前空間
root\Microsoft\Windows\Storage
・クラス
MSFT_Partition
MSFT_PartitionToVolume
今後は、もう少し勉強してから質問するよう気を付けます。
お二方、本当にありがとうございました。
>思い込んでしまっていたのがそもそもの原因です。
ほんどの用途ではそれで十分だと思います.
今回は特殊だと思います.
ちなみに名前空間には以下のようなものがあります.
http://wutils.com/wmi/namespaces.html
これまでレスの中で書いた内容のほとんどは,私のサイトの WMI 関係の記事,
あるいは記事内のリンクにあります (上のリンクもあります)
リンクをクリックしてまで読んでくださる方は中々いませんけど (笑)