Cannot get S.M.A.R.T. information for external drives(无法获取外部驱动器的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.信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:无法获取外部驱动器的S.M.A.R.T.信息
基础教程推荐
- 如何激活MC67中的红灯 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01