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