Laden...

Festplatten Temperatur auslesen

Erstellt von kInGsToNe vor 15 Jahren Letzter Beitrag vor 11 Jahren 10.330 Views
K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren
Festplatten Temperatur auslesen

Hallo liebe Community,

ich habe es mir zur Aufgabe gemacht ein Programm zu entwickeln welches die Festplatten Temperatur ausliest. Nun habe ich schon einiges über WMI gelesen weiß aber nicht wirklich weiter.

(außerdem soll die Festplatten Temperatur dann noch über TCP bereitgestellt werden die ich dann als Client auslesen kann das sei aber erstmal nach hinten gestellt)

Wäre super wenn mir jemand unter die Arme greifen könnte, bei dem ganzen.

Eine kleine Hilfestellung würde ja wahrscheinlich schon reichen.

Ich hoffe mir kann dazu jemand helfen.

Mit freundlichen Grüßen,

kInGsToNe

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

3.430 Beiträge seit 2007
vor 15 Jahren
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo kInGsToNe,

noch ein Stichwort: SMART

Self-Monitoring, Analysis and Reporting Technology

herbivore

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren

also ich muss ehrlich sagen ich komme nicht weiter.

ich weiß zwar das es mit

Win32_TemperatureProbe Class funktionieren muss aber ich weiß nicht wie.

In dem Beispiel wird nur

Win32_TemperatureProbe Class hinzugefügt aber wenn man sich dann im Programm den Eintrag anschaut bleibt das Feld leer, sprich es geht im BeispielProjekt nicht.

Ich möchte doch nur die Festplatten Temperatur auslesen?!

Und an Herbivore: Ich weiß nicht genau wie meine dein Link helfen sollte. Ich habe mir das Projekt

smartontools angesehen aber hier wird das ganze ja über .bat´s gelöst.

Ich möchte gerne eine entsprechende Lösung für C#?!

Bin für jede Hilfe dankbar 😉

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo kInGsToNe,

SMART war ein Stichwort zum Googlen (und der Link nur zur Begriffsklärung).

herbivore

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren

hallo herbivore,

SMART habe ich gefunden allerdings in C++ von dem ich nicht allzu viel verstehe. Bringt mich leider auch nicht weiter 🙁

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren

hat niemand ein c# bespiel das würde mir ziemlich helfen.

oder ein link wo das ganze verständlich erklärt ist.

zur zeit habe ich folgendes:

private string temp()
        {
            string temperature = null;
            ManagementClass mc = new ManagementClass("Win32_TemperatureProbe");
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {
                if (temperature == null)
                {
                    temperature = mo.Properties["CurrentRead"].Value.ToString();
                }
            }
            return temperature;
        } 

aber die foreach-Scheife wird nicht durchlaufen weil ncihts gefunden wird. Was soll ich tun?

Edit:

was mir grad eingefallen ist. muss ich nicht auch noch angeben von welcher hardware ich die temperatur messen möchte? (ich könnte ja 2 festplatten haben))

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

hast du den überhaupt verstanden was deine Methode tut? Und bei der for Schleife überschreibst du für jedes gefundenene Objekt die Temperatur wieder.

Gruß Daniel

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren

es geht mir nicht darum sofort den perfekten code zu haben. ich möchte nur das richtige ergebnis finden. anpassen kann ich den code dann auch noch.

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren

Hallo liebe myCSharp´ler 😉

ich weiß der Thread ist schon alt aber ich denke es ist besser hier noch einmal zu posten als einen neuen Thread aufzumachen.

Also ich habe das Projekt jetzt nach einiger Zeit mal fortgeführt und siehe da ich hab´s hinbekommen.

Nun sind meine Fragen nur:

  1. Habt ihr eine Idee wie ich den Code noch verbessern kann? Man lernt ja immer gern dazu 😉

  2. Die Problematik die sich stellt ist, dass jeder Hersteller den Sensor an einer anderen Stelle hat.

Byte[] arrVendorSpecific = (Byte[])(queryObj["VendorSpecific"]);
temperatur = Convert.ToString(arrVendorSpecific[127]);

127 gibt in diesem Byte Array die Temperatur von einer "Seagate" Platte ab.

Gibt es eine Liste wo die Hersteller + Nummer aufgelistet sind?

Oder kann ich irgendwie darauf überprüfen?..

In dem Byte Array arrVendorSpecific sind c.a 360 Einträge mit vielen unterschiedlichen aber auch gleichen Werten.

Die komplette Methode zum holen der Temperatur sieht bei mir so aus:


private void GetTemp()
        {
            try
            {
                string temperatur;
                string gesamt;

                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSStorageDriver_ATAPISmartData");
                ManagementObjectSearcher logicDisk = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

                foreach (ManagementObject queryObjDisk in logicDisk.Get())
                {
                    string DiskName = Convert.ToString(queryObjDisk["Model"]);

                    foreach (ManagementObject queryObj in searcher.Get())
                    {
                        Byte[] arrVendorSpecific = (Byte[])(queryObj["VendorSpecific"]);

                        if (DiskName.IndexOf("Maxtor") >= 0)
                        {
                            temperatur = Convert.ToString(arrVendorSpecific[151]);
                            gesamt = DiskName + " " + temperatur + "°C";
                            break;
                        }
                        else
                        {
                            if ((DiskName.IndexOf("Western Digital") >= 0) || (DiskName.IndexOf("WesternDigital") >= 0) || (DiskName.IndexOf("WD") >= 0))
                            {
                                temperatur = Convert.ToString(arrVendorSpecific[139]);
                                gesamt = DiskName + " " + temperatur + "°C";
                                break;
                            }
                            else if ((DiskName.IndexOf("Seagate") >= 0) || (DiskName.IndexOf("ST") >= 0) || (DiskName.IndexOf("Seagate Technology") >= 0))
                            {
                                temperatur = Convert.ToString(arrVendorSpecific[127]);
                                gesamt = DiskName + " " + temperatur + "°C";
                                break;
                            }
                        }
                    }
                }
            }

            catch (ManagementException err)
            {
                MessageBox.Show("Ein Fehler trat beim nachfragen der WMI-Daten auf: " + err.Message);
            }
        }

Ich hoffe mir kann jemand weiterhelfen da ich eigentlich alle Hersteller auslesen können will.

Vielleicht gibt es ja auch eine andere Möglichkeit. Eine kleine Hilfestellung wäre net.

Viele Grüße

kInGsToNe

Edit:

Das mit dem Festplattennamen habe ich nun etwas eleganter gelöst. Wie man oben sieht gibt es eine WMI-Klasse die nur den Namen übergibt =).

Die 2.te foreach-Schleife könnte man eigentlich weglassen, nur ich weiß nicht wie ich in ein ManagementObject die WMI Daten bekommt (wie in der foreach mit ManagementObject meinObject in seracher.Get())

Habe versucht das mit einer ManagementObjectCollection zu lösen und diese dann in ein ManagementObject mit CopyTo() zu kopieren aber das funktionierte nicht.

Hat da jemand eine Idee?

Bin ja offen für Verbesserungsvorschläge und nehme auch Kritik an.

Achja - falls euch noch etwas Unklar ist oder ihr Fragen habt, fragt ruhig.

Danke

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 15 Jahren

Das Tool funktioniert ja an sich einwandfrei aber:

Woher weiß ich mit welchem Index ich für welchen Hersteller VendorSpecific aufrufen muss?

Hier steht zwar eine Liste:

VendorSpecific Indexes

aber erstens ist diese nicht vollständig, zweitens habe ich zum Beispiel bei einer WesternDigital Festplatte 129°C obwohl ich mir nicht ganz sicher bin ob Fahrenheit oder Celsius, aber selbst wenn ich es umrechne komme ich weit ab von der Temperatur die mir bei Everest & Co angezeigt wird.

Was mich auch irritiert ist, dass die Werte sich nie verändern..

Ich hoffe jemand kann mir helfen, ich weiß echt nicht mehr weiter 😦...

Fragt bitte wenn ihr Fragen habt.

mFg kInGsToNe 😉

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

C
5 Beiträge seit 2007
vor 14 Jahren

Hi Kingstone,

interessante Sache =d vorallem weil ich momentan an der gleichen Problematik hänge da ich scheinbar was sehr ähnliches Programmieren will.

Mit deinem Ansatz bin cih schonmal gut vorran gekommen und werde mich damit jetzt noch weiter auseinandersetzen.

Hast du inzwischen schon weitergemacht... ist ja schon gute 8 Monate her seit dem letzten Post?

Grüße
cav3man

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 14 Jahren

Der ansatz mag stimmen aber ich wollte ja Hersteller unabhängig die Temperaturen auslesen.

Dazu müsste man, mit meiner Lösung zumindest, die VendorSpecific Indexes jedes Herstellers wissen bzw. herausfinden.

Allerdings habe ich S.M.A.R.T bei einige Festplatten den passenden VendorSpecific Index nicht gefunden.

Wie siehts den bei dir aus?

Schön das sich noch jemand meldet, ich hatte die Idee schon verworfen..

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

K
kInGsToNe Themenstarter:in
72 Beiträge seit 2007
vor 14 Jahren

so ich werd mich heute nochmal dran setzen und nach einer lösung suchen.

Falls jemand schon was gefunden hat kann er mir das gerne zukommen lassen. Ich bedanke mich für jede Hilfe.

Lg

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

P
11 Beiträge seit 2012
vor 11 Jahren

Ich beschäftige mich nun auch intensiv mit diesem Thema. Seit Ihr da mitlerweile weitergekommen?

Ich sitze momentan an dem Problem, dass ich für Seagate die ID 194 auslese. Leider gibt mir diese immer den Wert 199 zurück.

Wenn ich mir in anderen Foren dazu etwas anschaue, dann sollte die Abfrage "SELECT * FROM MSStorageDriver_ATAPISmartData" doch eigentlich eine ganze tabelle mit mehreren spalten zurückgeben.

Liest man mit dem obigen Code wirklich die richtige Spalte ein, bzw. wie komme ich auf den Wert 199? Hat jemand einer Erklärung dafür?