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

时间:2014-07-22 12:52:25

标签: c# .net wmi

我正在尝试获取外部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信息。

EDIT2:

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

  

通过 SPTI 访问SCSI和USB设备。特别的司机支持       不是必需的。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

Smartmontools拥有庞大的设备,磁盘和控制器数据库(查看drivedb.h以获取洞察力,它是大规模的),经过测试并定期更新,以及它是如何实现的知道如何与每个设备进行通信。基本上,低级设备伏都教魔术。操作系统通常不需要知道所有这些内容,他们只知道如何使用相应的驱动程序说USB,Firewire,RAID设备等。跨越协议边界不是这些驱动程序通常所做的事情。

所以我建议你使用smartmontools并解析它的输出,这样可以避免很多痛苦。