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

Cannot get S.M.A.R.T. information for external drives(无法获取外部驱动器的S.M.A.R.T.信息)
本文介绍了无法获取外部驱动器的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.信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)