System.Managementパッケージが必要です。
<ItemGroup>
<PackageReference Include="System.Management" Version="10.0.0-preview.6.25358.103" />
</ItemGroup>
ファイル名:StorageUtility.cs
// ストレージ関連
using System.IO;
using System.Management;
namespace CommonLib;
static class StorageUtility
{
static string MediaTypeToString(ushort code)
{
return code switch
{
3 => "HDD",
4 => "SSD",
5 => "SCM",
_ => "Unknown"
};
}
public static Dictionary<string, string> GetDriveTypeMap()
{
Dictionary<string, string> driveTypes = [];
// 物理ディスクの DeviceId → MediaType(3=HDD, 4=SSD, 5=SCM)
var scope = new ManagementScope(@"\\.\root\microsoft\windows\storage");
scope.Connect();
var diskTypeMap = new Dictionary<string, string>();
foreach (ManagementObject disk in new ManagementObjectSearcher(scope, new ObjectQuery("SELECT * FROM MSFT_PhysicalDisk")).Get())
{
string id = disk["DeviceId"]?.ToString() ?? "";
ushort typeCode = (ushort)(disk["MediaType"] ?? 0);
diskTypeMap[id] = MediaTypeToString(typeCode);
}
// 物理ディスクの DeviceID(\\.\PHYSICALDRIVE0)→ Index("0")
var driveIdToPhysicalId = new Dictionary<string, string>();
foreach (ManagementObject dd in new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive").Get())
{
string deviceId = dd["DeviceID"]?.ToString() ?? "";
string index = dd["Index"]?.ToString() ?? "";
if (!string.IsNullOrEmpty(deviceId) && !string.IsNullOrEmpty(index))
driveIdToPhysicalId[deviceId] = index;
}
// ドライブレターごとの分類
foreach (var di in DriveInfo.GetDrives())
{
if (!di.IsReady) continue;
string name = di.Name[..^1]; // "C:\" → "C:"
if (di.DriveType == DriveType.Network)
{
driveTypes[name] = "NAS";
continue;
}
if (di.DriveType != DriveType.Fixed) continue;
var query = $@"ASSOCIATORS OF {{Win32_LogicalDisk.DeviceID='{name}'}} WHERE AssocClass=Win32_LogicalDiskToPartition";
foreach (ManagementObject partition in new ManagementObjectSearcher(query).Get())
{
string? partId = partition["DeviceID"]?.ToString();
if (partId is null) continue;
var partQuery = $@"ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{partId}'}} WHERE AssocClass=Win32_DiskDriveToDiskPartition";
foreach (ManagementObject diskDrive in new ManagementObjectSearcher(partQuery).Get())
{
string? driveId = diskDrive["DeviceID"]?.ToString();
if (driveId is null || !driveIdToPhysicalId.TryGetValue(driveId, out var physicalId)) continue;
driveTypes[di.Name] = diskTypeMap.TryGetValue(physicalId, out var typeStr) ? typeStr : "Unknown";
}
}
}
return driveTypes;
}
}
/*
使用例
var driveTypeMap = StorageUtility.GetDriveTypeMap();
foreach(var key in driveTypeMap.Keys)
{
Console.WriteLine($"{key} {driveTypeMap[key]}");
}
結果
C:\ SSD
D:\ SSD
E:\ SSD
F:\ SSD
G:\ SSD
I:\ SSD
J:\ SSD
X:\ NAS
Y:\ NAS
Z:\ NAS
*/
コメント