2011-11-10 27 views
11

¿Es posible ver la temperatura Harrdisk con somekind de S.M.A.R.T API o algo por el estilo?¿Cómo se lee la temperatura del disco duro?

sólo quiero la temperatura, nada más en C#

+0

Y dónde está el problema? – Burimi

+1

hay isen't ningún problema .. i sólo tiene que encontrar un API de SMART - ive google'd pero coulden't encontrar ninguna .. – Mathias

Respuesta

6

Aquí está el fragmento de código de este article creo que sirve

//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

por qué es tempIndex + 5, y he publicado una pregunta sobre esto ya, pero hago usted sabe cómo obtener los datos de atributo 193 (número de ciclos de carga/descarga) –

+0

funciona bien, una vez que cambie '' Lista list' a 'e incluir la referencia a' System.Management'. Devuelve Celsius para unidades locales, 0 para una SSD. – TaW

1

usar VMI y MSStorageDriver_ATAPISmartData para obtener VendorSpecific matriz de bytes y 115 el número de bytes es temperatura. ¿Por qué 115? Más here.

código generado en parte 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(); 
    } 
} 
Cuestiones relacionadas