■97345 / inTopicNo.4) |
Re[3]: 内蔵か外付けを判別する方法 |
□投稿者/ 魔界の仮面弁士 (3089回)-(2021/04/28(Wed) 02:58:11)
|
■No97337 (常磐 さん) に返信
> ある程度ドライブレターがどのドライブに属しているかは
> どのように調べれば良いですか?
目視確認なら
diskmgmt.msc
で行えますね。
物理ドライブとして、ディスク 0、ディスク 1、ディスク 2 …という情報があり、
それぞれに対して、パーティションが切られています。RAID のケースもあるため、これらは多対多の関係になりえます。
そして、そのパーティション領域に対してドライブレターやフォルダーが割り当てられることになりますね。
これらの情報は、 No97335 で列挙した WMI のクラスを使って取得できます。
> ある程度ドライブレターがどのドライブに属しているかは
「物理ディスクのパーティション領域」を表すのが【Win32_DiskPartition クラス】、
「ハードディスクの記憶域」を表すのが【Win32_Volume クラス】、
「物理ディスク ドライブ」を表すのが【Win32_DiskDrive クラス】、
「論理ディスク(および、マップ)」が【Win32_LogicalDisk クラス】
「論理ディスクがあるディスク パーティション」(Win32_DiskPartition) と、
「物理ディスクのパーティションにある論理ディスク」(Win32_LogicalDisk) の関連付けを表すのが
【Win32_LogicalDiskToPartition クラス】
「パーティションが存在するディスク ドライブ」(Win32_DiskDrive) と、
「ディスク ドライブにあるディスク パーティション」(Win32_DiskPartition) の関連付けを表すのが
【Win32_DiskDriveToDiskPartition クラス】です。
ドライブレターから、物理ディスク装置を辿るには、
Win32_LogicalDisk
→ (Win32_LogicalDiskToPartition)
→ Win32_DiskPartition
→ (Win32_DiskDriveToDiskPartition)
→ Win32_DiskDrive
のように辿っていけば、目的を果たせるかと思います。
ただし、それらの装置が外付けか内蔵かは、PC に対する物理的な搭載位置でしか分かりません。
WMI で得られるインターフェイス情報などから推測することはできそうですが、最終的には人力判定ですね。
そして WMI を扱うには、最初に御提示頂いた 教えて!goo の回答にもあったように、
System.Management を参照設定して、ManagementObjectSearcher などからアクセスすることができます。
また、WMI のクラスをプログラムから扱いやすくするため、MgmtClassGen.exe という
クラス ジェネレーターを使えます。これは、WMI 操作のためにカプセル化されたクラスを生成するツールです。
https://docs.microsoft.com/ja-jp/dotnet/framework/tools/mgmtclassgen-exe
上記ツールは、Visual Studio コマンド プロンプトから、「MgmtClassGen Win32_DiskDrive」などとすることで
Win32_DiskDrive.cs ファイルが生成されます。パラメーターを指定すれば VB 版も作れます。
こうして生成した .cs ファイル群をプロジェクトに加えてやれば、
IntelliSense が使えますし、列挙情報も enum 化されるので、コーディングも容易です。
参考までに、この *.cs ファイルを使って、ディスク情報を単純列挙するコードを書いてみます。
(参照設定に System.Management も必要です)
Win32_DiskDrive の情報に、内蔵/外付けの判定に使えそうな内容が含まれているか確認してみてください。
using System;
using ROOT.CIMV2.Win32; // この名前空間は、MgmtClassGen.exe で生成されたクラスに含まれています。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("★★Win32_LogicalDisk (論理ディスク)");
Console.WriteLine("☆☆ドライブレターを持つ論理ディスクの情報です。ネットワークドライブや DVD ドライブも含みます。");
foreach (LogicalDisk item in LogicalDisk.GetInstances())
{
Console.WriteLine("DeviceID={0}", item.DeviceID); // 識別子(ドライブレター)
Console.WriteLine(" FileSystem={0}", item.FileSystem); // 論理ディスクのファイル システム
Console.WriteLine(" DriveType={0}", item.DriveType); // 論理ディスク ドライブの種類
Console.WriteLine(" MediaType={0}", item.MediaType); // 論理ドライブに現在あるメディアの種類
Console.WriteLine(" VolumeName={0}", item.VolumeName); // 論理ドライブのボリューム名
}
Console.WriteLine();
Console.WriteLine("★★Win32_DiskDrive (物理ドライブ)");
Console.WriteLine("☆☆HDDやSSDの物理ドライブの情報です。論理ディスクに割り当てられていないドライブも含みます。");
foreach (DiskDrive item in DiskDrive.GetInstances())
{
Console.WriteLine("Index={0}", item.Index); // 物理ドライブ番号
Console.WriteLine("DeviceID={0}", item.DeviceID); // 識別子
Console.WriteLine(" Partitions={0}", item.Partitions); // 物理ドライブのパーティション数
Console.WriteLine(" InterfaceType={0}", item.InterfaceType); // 物理ディスク ドライブのインターフェイスの種類
Console.WriteLine(" MediaType={0}", item.MediaType); // メディアの種類
Console.WriteLine(" Model={0}", item.Model); // ディスク ドライブ製造元のモデル番号
Console.WriteLine(" SerialNumber={0}", item.SerialNumber); // 製造元が割り当てた物理メディアの識別番号
Console.WriteLine(" Manufacturer={0}", item.Manufacturer); // ディスク ドライブ製造元名
}
Console.WriteLine();
Console.WriteLine("★★Win32_Volume (ハードディスクの記憶域の領域)");
Console.WriteLine("☆☆HDDやSSDの記憶域の領域です。未フォーマットや非マウント状態のパーティション領域も含みます。");
foreach (Volume item in Volume.GetInstances())
{
Console.WriteLine("DeviceID={0}", item.DeviceID); // 識別子
Console.WriteLine("DriveLetter={0}", item.DriveLetter); // ドライブレター
Console.WriteLine(" DriveType={0}", item.DriveType); // 論理ディスクが表すディスク ドライブの種類
Console.WriteLine(" FileSystem={0}", item.FileSystem); // 論理ディスクのファイル システム
Console.WriteLine(" Label={0}", item.Label); // 論理ディスクのボリューム名
Console.WriteLine(" SerialNumber={0}", item.SerialNumber); // ボリュームのシリアル番号
}
Console.WriteLine();
Console.WriteLine("-- Push Enter Key --");
Console.ReadLine();
}
}
上記では単純に全列挙としていますが、たとえば C: ドライブの Win32_LogicalDisk だけを得たいような場合には、
foreach (LogicalDisk logical in LogicalDisk.GetInstances(@"DeviceID='C:'"))
のように、条件を指定して問い合わせることもできます。
また、今回のケースでは Win32_LogicalDiskToPartition と Win32_DiskDriveToDiskPartition を使って、
該当ドライブレターのパーティションを持つ物理ドライブ(RAID の場合は複数になりえる)を探ることになります。
パーティションを辿って取得する方法は、過去ログ No82538 で述べているので、そちらも参照してみてください。
http://bbs.wankuma.com/index.cgi?mode=red&namber=82538&KLOG=141
|
|