C#でドライブの種類(SSD,HDD,NASなど)を取得

コンピュータ

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

*/

コメント