- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试获取外部 USB 驱动器的 SMART 信息。我正在使用以下查询来获取驱动器的温度,但是查询总是返回集合中的单个对象,这是我的内部硬盘。
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:
深入挖掘,我在 SmartMonTools 中找到了这一段Windows下INSTALL文件:
SCSI and USB devices are accessed through SPTI. Special driver support is not required.
现在我想我只需要将其放入 WMI 查询中,有人可以帮忙吗?
最佳答案
SMART是 ATA 标准的一部分。甚至 WMI 类的名称也反射(reflect)了这一点。
当您通过 USB 插入设备时,它会使用 USB 大容量存储协议(protocol)与您的系统通信。它根本不支持 SMART。通常,USB 连接的硬盘与 USB 连接的 pendrive 或 SD 卡没有什么不同,因此 SMART 在这里没有意义。 SCSI、Firewire 等也是如此,它们是不同的协议(protocol)。您不知道另一端是什么,它可能根本不会说 ATA。
某些协议(protocol),例如USB硬盘使用的协议(protocol),允许ATA命令通过不同的协议(protocol)层传递,正如您所说,SPTI就是其中一种方法。虽然它被许多设备支持,但它有点 hack 并且可能不是每个 USB 磁盘 Controller 都支持,甚至可能导致问题(任何 ATA 数据包都可能通过,这可能很危险) . RAID 设备可能使用其他专有协议(protocol)来传递 ATA 命令。
所以基本上,没有与这些设备通信的通用协议(protocol),尽管我不能绝对肯定,但我很确定 WMI 不支持它,因为这是一项非常复杂的任务。
Smartmontools 有一个巨大的设备、磁盘和 Controller 数据库(请查看 drivedb.h 了解情况,它很大),它经过测试并定期更新,这就是它知道如何与这些设备中的每一个进行通信的方式。基本上是低级装置巫毒魔法。操作系统通常不需要知道所有这些东西,他们只知道如何使用相应的驱动程序来使用 USB、Firewire、RAID 设备等。这些驱动程序通常不会跨越协议(protocol)边界。
所以我建议你使用 smartmontools 并解析它的输出,它会让你省去很多痛苦。
关于c# - 无法获得 S.M.A.R.T.外部驱动器的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24887956/
我是一名优秀的程序员,十分优秀!