2011-11-10 12 views
11

È possibile vedere la temperatura di Harrdisk con un po 'di API S.M.A.R.T o qualcosa del genere?Come leggere la temperatura di HardDisk?

Voglio solo la temperatura, nient'altro in C#

+0

E dov'è il problema? – Burimi

+1

non c'è alcun problema .. ho solo bisogno di trovare un'API SMART - ive google'd ma non ho potuto trovare alcun .. – Mathias

risposta

6

Ecco frammento di codice da questo article Speranza che aiuta

//S.M.A.R.T. Temperature attritube 

const byte TEMPERATURE_ATTRIBUTE = 194; 
public List GetDriveTemp() 
{ 
    List retval = new List(); 
    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; 
} 
+0

perché è tempIndex + 5, e ho già postato una domanda su di esso, ma faccio sai come ottenere i dati dall'attributo 193 (carica/scarica il conteggio del ciclo) –

+0

Funziona bene, una volta modificato 'Elenco' in' Elenco 'e includi il riferimento a' System.Management'. Restituisce Celsius per le unità locali, 0 per un SSD. – TaW

1

utilizzano VMI e MSStorageDriver_ATAPISmartData per ottenere VendorSpecific array di byte e 115 il numero di byte è temperatura. Perché 115? Più here.

Codice in parte generato con 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(); 
    } 
}