如何获得全部S.M.A.R.T。 .Net 上 StorageSpaces 物理磁盘的数据?

How to get all S.M.A.R.T. data of StorageSpaces physical disks on .Net?

有两种最流行的方式:PowerShell (PowerShell.Create()...) 和 WMI (ManagementObjectSearcher)。

1) PowerShell Get-PhysicalDisk 可以正确检索磁盘,但它没有 VendorSpecific 属性 (SMART)。 Get-StorageReliabilityCounter 填充了一些常见的 SAMRT 属性,但不是全部。具体来说,它不显示 'Reallocated Sectors Count' 和 'Pending Sectors'

2) WMI SELECT * FROM Win32_DiskDrive 可以查询,但这个显示虚拟磁盘。实际的物理磁盘不存在。对于软件 RAID(在磁盘管理中添加镜像)或存储空间,实际物理磁盘已经被过滤掉。 SELECT * FROM MSStorageDriver_FailurePredictData 显示了我正在寻找的 SMRART(供应商特定)信息,但也没有物理驱动器,也无法将 'InstanceName' 与实际的磁盘列表相关联。

同时,第 3 方软件可以清楚地显示物理磁盘和虚拟磁盘(存储空间本身),并可以为它们显示 SMART:

一天结束时,我想在 .Net 应用程序中使用它,我用谷歌搜索了一些代码如何从 WMI 对象的 VendorSpecific 字段中提取此信息(重新分配的扇区计数),但我就是看不到 WMI实际物理磁盘的对象。

显然我的主要问题是小型家庭服务器上的 USB 驱动器。存储空间或 RAID 上的 USB 设备没有简单的解决方案。所有现有软件都有大量专有代码来支持不同制造商的 SMART over USB(特别是 CrystalDiskInfo,它可以轻松显示隐藏在存储空间后面的所有 USB 驱动器的所有 SMART),因此它远非 100 行 C# 代码解决方案。

但我发现最初的问题(我需要 2 条记录)实际上已由 PowerShell 解决,Microsoft 只是重命名了一些指标,使它们对用户友好。

这就是 SMART 转换为 -> PowerShell 的方式 Get-StorageReliabilityCounter

重新分配的扇区数 -> ReadErrorsCorrected

待定扇区 -> ReadErrorsUncorrected

当我在其中一个驱动器上获得两条记录时,这变得很清楚了: