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.信息


- 如何用自己压缩一个 IEnumerable 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 输入按键事件处理程序 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01