无法获得 S.M.A.R.T.外部驱动器的信息

Posted

技术标签:

【中文标题】无法获得 S.M.A.R.T.外部驱动器的信息【英文标题】:Cannot get S.M.A.R.T. information for external drives 【发布时间】:2014-09-13 07:23:03 【问题描述】:

我正在尝试获取外部 USB 驱动器的 SMART 信息。我正在使用以下查询来获取驱动器的温度,但是该查询始终返回集合中的单个对象,这是我的内部 HDD。

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI",
"SELECT * FROM MSStorageDriver_ATAPISmartData");

foreach (ManagementObject queryObj in searcher.Get())

   if (queryObj["VendorSpecific"] != null)
   
       byte[] arrVendorSpecific = (byte[])(queryObj["VendorSpecific"]);
       string temp = arrVendorSpecific[115].ToString();
    
 

到目前为止,我已经尝试了来自不同供应商的 3 种不同的驱动器,但我获取信息的所有尝试都失败了。

我做错了什么,如何通过 WMI 获取外部驱动器的 SMART 信息?

编辑:我尝试了PassMarks's DiskCheckup,它能够获取所有驱动器的 SMART 信息。

编辑2:

深入挖掘我在Windows下的SmartMonToolsINSTALL文件中找到了这一段:

SCSI 和 USB 设备通过 SPTI 访问。特殊驱动支持 不是必需的。

现在我认为我需要的只是将其放入 WMI 查询中,有人可以帮忙吗?

【问题讨论】:

如果您下载第三方工具来查看 SMART 信息,它是否适用于那些外部驱动器? 是的,我只试过PassMark's DiskCheckup,它能够获取驱动器的SMART信息。 @MobyDisk 我在帖子中添加了更多信息。你能查一下吗? 【参考方案1】:

SMART 是 ATA 标准的一部分。甚至 WMI 类的名称也反映了这一点。

当您通过 USB 插入设备时,它会使用 USB 大容量存储协议与您的系统进行通信。它根本不支持SMART。通常,USB 连接的硬盘与 USB 连接的 pendrive 或 SD 卡没有什么不同,因此 SMART 在这里没有意义。 SCSI、Firewire 等也是如此,它们是不同的协议。你不知道另一端是什么,它可能根本不会说 ATA。

有些协议,比如 USB 硬盘使用的协议,允许 ATA 命令通过不同的协议层,正如您所说,SPTI 就是其中一种方法。虽然它被许多设备支持,但它是一种 hack,可能不是每个 USB 磁盘控制器都支持,甚至可能导致问题(任何 ATA 数据包可能会通过,这可能很危险) . RAID 设备可以使用其他专有协议来传递 ATA 命令。

因此,基本上,没有通用协议可以与这些设备通信,尽管我不能绝对肯定,但我很确定 WMI 不支持它,因为这是一项非常复杂的任务。

Smartmontools 拥有庞大的设备、磁盘和控制器数据库(请查看 drivedb.h 了解详情,它非常庞大),它经过测试并定期更新,这就是它知道如何与这些设备中的每一个通信的方式。基本上是低级设备巫术魔法。操作系统通常不需要知道所有这些东西,他们只需知道如何使用相应的驱动程序来使用 USB、Firewire、RAID 设备等。这些驱动程序通常不会跨越协议边界。

所以我建议你使用 smartmontools 并解析它的输出,它会让你免于很多痛苦。

【讨论】:

哇,谢谢你的解释,我真的很感激。 So I suggest that you use smartmontools and parse its output, it will save you from a lot of pain. 遗憾的是,根据他们当前的许可,我无法将 smartmontools 合并到商业应用程序中。将尝试与他们联系,看看是否有任何方法可以用于商业应用。 答案不正确(不再)。有可用的 USB 3.0 连接器允许通过 USAP(USB 连接 SCSI 协议)将 SCSI 命令传递到连接的驱动器。

以上是关于无法获得 S.M.A.R.T.外部驱动器的信息的主要内容,如果未能解决你的问题,请参考以下文章

无法获得VMCI 驱动程序的版本: 句柄无效。

Raspbian Jessie:“apt-get upgrade”后无法再安装 NTFS 外部硬盘驱动器(保险丝设备丢失)

docker ERROR:对于 nginx 无法启动服务 nginx:驱动程序在编程外部连接时失败

bartender链接数据库提示:无法链接到数据库 外部数据驱动程序中的意外错误#6670

无法在Postgres中实例化外部Hive Metastore /在类路径中找不到驱动程序

在 XP 和 Windows 7 上的外部硬盘驱动器上运行 xampp