我正在尝试获取外部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查询中,有人可以帮忙吗?
答案 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并解析它的输出,这样可以避免很多痛苦。