我正在尝试获取外部 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 的磁盘检查 http://www.passmark.com/products/diskcheckup.htm并且它能够获取所有驱动器的SMART信息。
EDIT2:
深入挖掘,我发现了这一段SmartMon工具 http://www.smartmontools.org/Windows下安装文件:
SCSI 和 USB 设备通过以下方式访问SPTI。特殊驱动支持
不需要。
现在我想我需要的就是将其放入 WMI 查询中,有人可以帮忙吗?
SMART http://en.wikipedia.org/wiki/S.M.A.R.T.是 ATA 标准的一部分。甚至 WMI 类的名称也反映了这一点。
当您通过 USB 插入设备时,它会通过 USB 大容量存储协议与您的系统进行通信。它根本不支持SMART。一般来说,USB 连接的硬盘与 USB 连接的随身碟或 SD 卡没有什么不同,因此 SMART 在这里没有任何意义。 SCSI、Firewire 等也是如此,它们是不同的协议。您不知道另一端是什么,它可能根本不支持 ATA。
某些协议,例如 USB 硬盘使用的协议,允许 ATA 命令通过不同的协议层传递,正如您所说,SPTI 就是其中一种方法。尽管许多设备都支持它,但它是一种 hack,可能并非每个 USB 磁盘控制器都支持,甚至可能会导致问题(anyATA 数据包可能会被传递,这可能很危险)。 RAID 设备可以使用其他专有协议来传递 ATA 命令。
所以基本上,没有通用协议可以与这些设备通信,尽管我不能绝对肯定,但我很确定 WMI 不支持它,因为这是一项非常复杂的任务。
Smartmontools 拥有庞大的设备、磁盘和控制器等数据库(查看驱动数据库.h http://www.smartmontools.org/browser/trunk/smartmontools/drivedb.h对于洞察力来说,它是巨大的),它经过测试并定期更新,这就是它知道如何与每个设备进行通信的方式。基本上是低级装置巫术魔法。一般来说,操作系统不需要知道所有这些东西,它们只需要足够了解如何使用相应的驱动程序来使用 USB、Firewire、RAID 设备等。这些驱动程序通常不会跨越协议边界。
所以我建议你使用 smartmontools 并解析它的输出,它会让你免去很多痛苦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)