Как определить температуру жесткого диска?

#c# #hardware-interface

#c# #аппаратный интерфейс

Вопрос:

Возможно ли увидеть температуру жесткого диска с помощью какого-нибудь API S.M.A.R.T. или чего-нибудь подобного?

мне просто нужна температура, ничего больше в C#

Комментарии:

1. никаких проблем нет .. мне просто нужно найти S.M.A.R.T. API — я погуглил, но не смог ничего найти..

Ответ №1:

Вот фрагмент кода из этой статьи, надеюсь, это поможет

 //S.M.A.R.T.  Temperature attribute
const byte TEMPERATURE_ATTRIBUTE = 194;

public List<byte> GetDriveTemp()
{
    var retval = new List<byte>();
    try
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\WMI", "SELECT * FROM MSStorageDriver_ATAPISmartData");
        //loop through all the hard disks
        foreach (ManagementObject queryObj in searcher.Get())
        {
            byte[] arrVendorSpecific = (byte[])queryObj.GetPropertyValue("VendorSpecific");
            //Find the temperature attribute
            int tempIndex = Array.IndexOf(arrVendorSpecific, TEMPERATURE_ATTRIBUTE);
            retval.Add(arrVendorSpecific[tempIndex   5]);
        }
    }
    catch (ManagementException err)
    {
        Console.WriteLine("An error occurred while querying for WMI data: "   err.Message);
    }
    return retval;
}
  

Комментарии:

1. почему это tempIndex 5, и я уже опубликовал вопрос по этому поводу, но знаете ли вы, как получить данные из атрибута 193 (количество циклов загрузки / выгрузки)

2. Работает нормально, как только вы измените List на List<byte> и включите ссылку на System.Management . Возвращает значение Цельсия для локальных дисков, 0 для SSD.

Ответ №2:

используйте VMI и, MSStorageDriver_ATAPISmartData чтобы получить VendorSpecific массив байт, а число 115 байт — это температура. Почему 115? Подробнее здесь.

Код, частично сгенерированный с помощью VMI Code Creator

 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();
    }
 }