本文介绍了无法获取外部驱动器的S.M.A.R.T.信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试获取外部USB驱动器的智能信息。我使用以下查询来获取驱动器的温度,但是该查询总是返回集合中的一个对象,即我的内部硬盘。
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获取外部驱动器的智能信息?
编辑:我尝试了PassMarks's DiskCheckup,它能够获取所有驱动器的智能信息。
EDIT2:
进一步挖掘,我在Windows下的SmartMonTools安装文件中发现了这段话:
通过SPTI访问SCSI和USB设备。特殊的驱动程序支持 不是必需的。
现在我想我所需要的就是将其放入WMI查询中,有人能帮忙吗?
SMART是推荐答案标准的一部分。甚至WMI类的名称也反映了这一点。
当您通过USB插入设备时,它会使用USB大容量存储协议与您的系统进行通信。它根本不支持SMART。一般来说,USB连接的硬盘与USB连接的挂盘或SD卡没有什么不同,所以SMART在这里没有意义。同样的道理也适用于scsi、火线等,它们是不同的协议。你不知道电话的另一端是什么,它可能根本不会说ATA。
有些协议,如USB硬盘使用的协议,允许ATA命令通过不同的协议层传递,如您所说,SPTI就是其中之一。虽然许多设备都支持它,但它是一种黑客行为,可能不是每个USB磁盘控制器都支持它,甚至可能会导致问题(任何ATA包都可能被通过,这可能是危险的)。RAID设备可以使用其他专有协议来传递ATA命令。因此,基本上没有与这些设备通信的通用协议,尽管我不能绝对肯定,但我非常确定WMI不支持它,因为这是一项非常复杂的任务。
SmartmonTools有一个巨大的数据库,其中包括设备、磁盘和控制器(请查看drivedb.h了解情况,它非常庞大),它经过测试并定期更新,这就是它知道如何与这些设备进行通信的方式。基本上是低级设备的巫毒魔法。一般来说,操作系统不需要知道所有这些东西,他们只需要知道如何使用各自的驱动程序来与USB、Firewire、RAID设备等对话即可。这些驱动程序通常不会跨越协议边界。所以我建议您使用SmartMonTools并解析其输出,这将使您省去很多痛苦。
这篇关于无法获取外部驱动器的S.M.A.R.T.信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!