Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Betriebsstunden einer Festplatte auslesen? (https://www.delphipraxis.net/113188-betriebsstunden-einer-festplatte-auslesen.html)

DelphiPeter 4. Mai 2008 11:07


Betriebsstunden einer Festplatte auslesen?
 
Hallo!

Weiß jemand von euch, wie ich die betriebsstunden einer Festplatte auslesen kann? Das müsste doch irgendwie zu machen sein, oder? Habe leider bis jetzt noch nichts dazu finden können.

Gruß
Peter

ddcool 4. Mai 2008 11:11

Re: Betriebsstunden einer Festplatte auslesen?
 
Das ganze nennt sich S.M.A.R.T. sofern das die Festplatte unterstützt.
Wie man das damit hinbekomm weiss ich leider nicht.
Vll kannst du das auch über WMI auslesen.
Benutzt mal due SuFu oder Google.


Grüße

ddcool


Edit: Hier ist noch ein Link zum Wikipedia Artikel: http://de.wikipedia.org/wiki/Self-Mo...ing_Technology

Edit2: @himitsu: Danke für deine Ergänzung. Hatte vergessen das zu schreiben. :thumb:

himitsu 4. Mai 2008 11:24

Re: Betriebsstunden einer Festplatte auslesen?
 
S.M.A.R.T. ist richtrig und dazu gibt's hier auch schon einige Threads (vorwiegend von Muetze1 und Co.).

Aber es muß nicht nur die festplatte unterstützen, sondern auch die Controler,
denn diese müßen ja die Befehle weiterleiten.

(z.B.: meine IDE- und SATA-Plättchen daheim unterstützen alle S.M.A.R.T., aber der IDE-Controler nicht ... folglich hab ich nur bei den S-ATAs Zugriff darauf)

hathor 6. Nov 2010 18:01

AW: Betriebsstunden einer Festplatte auslesen?
 
Der Thread ist zwar alt, aber weil so etwas immer wieder gesucht wird::-D:-D:-D

ATTR_POWER_ON_HRS_COUNT u.a.

http://www.magsys.co.uk/delphi/magwmi.asp
http://www.magsys.co.uk/download/software/magwmi53.zip

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls,
  smart_drv, magsubs1, magwmi;// http://www.magsys.co.uk/download/software/magwmi53.zip

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Memo1: TMemo;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    function GetDriveTemp(drive:longint):byte;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function HexToStr(w : Int64) : string;
const
  ByteToChar : array[0..$F] of char ='0123456789ABCDEF';
var
  s : string;
  i : integer;
  x : int64;
begin
  s := '';
  x := w;
  for i := 0 to 3 do
  begin
    s := ByteToChar[Byte(x) shr 4] + ByteToChar[Byte(x) and $F] + s;
    x := x shr 8;
  end;
  HexToStr := s;
end;


function TForm1.GetDriveTemp(drive:Integer):byte;
var i, B2 : Integer;
begin
result:=0;  Memo1.clear;
ReadSMART;
for i:=0 to 255 do
begin
//  ATTR_READ_ERROR_RATE = 1;
if SCOP[0].attr[i].bAttrID=1 then
begin
result:=SCOP[0].attr[i].Raw[0];
Memo1.lines.add('ATTR_READ_ERROR_RATE: '+HexToStr(result));
end;
//ATTR_POWER_ON_HRS_COUNT = 9;
if SCOP[0].attr[i].bAttrID=9 then
begin
B2:= SCOP[0].attr[i].Raw[0]+(SCOP[0].attr[i].Raw[1]*256);
Memo1.lines.add('ATTR_POWER_ON_HRS_COUNT in hours: '+IntToStr(B2));
end;
//ATTR_TEMPERATURE_CELCIUS = 194 ;
if SCOP[0].attr[i].bAttrID=194 then
begin
result:=SCOP[0].attr[i].Raw[0];
Memo1.lines.add('ATTR_TEMPERATURE_CELCIUS: '+IntToStr(result));
break;
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
Begin
GetDriveTemp(0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
GetDriveTemp(0);
end;

end.

(*
Const
  ATTR_INVALID = 0;
  ATTR_READ_ERROR_RATE = 1;
  ATTR_THROUGHPUT_PERF = 2;
  ATTR_SPIN_UP_TIME = 3;
  ATTR_START_STOP_COUNT = 4;
  ATTR_REALLOC_SECTOR_COUNT = 5;
  ATTR_READ_CHANNEL_MARGIN = 6;
  ATTR_SEEK_ERROR_RATE = 7;
  ATTR_SEEK_TIME_PERF = 8;
  ATTR_POWER_ON_HRS_COUNT = 9;
  ATTR_SPIN_RETRY_COUNT = 10;
  ATTR_CALIBRATION_RETRY_COUNT = 11;
  ATTR_POWER_CYCLE_COUNT = 12;
  ATTR_EMERGENCY_RETRACT_CYCLE = 192 ; // C0
  ATTR_LOAD_CYCLE_COUNT = 193 ; // C1
  ATTR_TEMPERATURE_CELCIUS = 194 ; // C2
  ATTR_HARDWARE_ECC = 195 ; // C3
  ATTR_REALLOCATION_EVENT_COUNT = 196 ; // C4
  ATTR_CURRENT_PENDING_SECTOR = 197 ; // C5
  ATTR_OFF_LINE_UNCORRECTABLE = 198 ; // C6
  ATTR_ULTRA_ATA_CRC_ERROR_RATE = 199 ; // C7
  ATTR_MULTI_ZONE_ERROR_RATE = 200 ; // C8
  ATTR_SOFT_READ_ERROR_RATE = 201 ; // C9
  ATTR_OFF_TRACK_ERRORS = 201 ; // C9 - alternative Maxtor
  ATTR_TA_INCREASE_COUNT = 202 ; // CA
  ATTR_RUN_OUT_CANCEL = 203 ; // CB
  ATTR_ECC_ERRORS = 203 ; // CB - alternative Maxtor
  ATTR_SHOCK_COUNT_WRITE_OPS = 204 ; // CC
  ATTR_SHOCK_RATE_WRITE_OPS = 205 ; // CD
  ATTR_SPIN_HIGH_CURRENT = 207 ; // CE
  ATTR_SPIN_BUZZ = 208 ; // CF
  ATTR_OFFLINE_SEEK_PERF = 209 ; // D0
  *)

omata 6. Nov 2010 20:21

AW: Betriebsstunden einer Festplatte auslesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal eine Zusammenstellung, die das wesentliche enthält.

toms 7. Nov 2010 07:19

AW: Betriebsstunden einer Festplatte auslesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von omata (Beitrag 1060111)
Hier mal eine Zusammenstellung, die das wesentliche enthält.

So, und jetzt sollte es auch mit Windows Vista/7 und Delphi Unicode funktionieren.

Bummi 7. Nov 2010 08:25

AW: Betriebsstunden einer Festplatte auslesen?
 
@toms
Danke, bliebe noch zu erwähnen dass ab Vista administrative Rechte benötigt werden.

Luckie 7. Nov 2010 08:27

AW: Betriebsstunden einer Festplatte auslesen?
 
Danke, jetzt sehe ich unter Windows 7 Starter auch was. ;)

Bummi 7. Nov 2010 08:42

AW: Betriebsstunden einer Festplatte auslesen?
 
@Luckie
mach mich schlau, ich hatte einen derartigen Kastraten noch nicht in den Händen.:shock:

Luckie 7. Nov 2010 08:55

AW: Betriebsstunden einer Festplatte auslesen?
 
Windows 7 Starter ist üblicherweise auf Netbooks installiert. Damit muss ich mich im Moment zufrieden geben, da ich im Moment aus gesundheitlichen Gründen bei meinen Eltern wohne und nur ab und zu mal an meinem Rechner mit XP zu Hause komme.

Es unterscheidet sich in so fern von anderen Windows 7 Versionen, dass es etwas kastriert ist. Kein Aero, man kann das Hintergrundbild nicht ändern usw. Aber ansonsten habe ich bisher noch keine Einschränkungen feststellen können, außer dass mein Usermanager unter Windows 7 Starter streikt. Hat irgendwas mit dem Netzwerk zu tun.

omata 7. Nov 2010 10:14

AW: Betriebsstunden einer Festplatte auslesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal eine Version, die nach Adminrechten fragt, wenn sie nicht vorhanden sind.

Bummi 7. Nov 2010 10:34

AW: Betriebsstunden einer Festplatte auslesen?
 
Hier geht es um die administrativen Rechte in der Art von "Ausführen als Administrator" läßt sich AFAIK nur über ein entsprechendes Manifest erreichen und dann nicht umschaltbar, sondern direkt beim Programmstart.

toms 7. Nov 2010 10:53

AW: Betriebsstunden einer Festplatte auslesen?
 
Zitat:

Zitat von omata (Beitrag 1060155)
Hier mal eine Version, die nach Adminrechten fragt, wenn sie nicht vorhanden sind.

Habe es ohne Adminrechte unter Vista getestet. Resultat: Es funktioniert auch ohne diese Rechte und zudem wird nicht nach Adminrechten gefragt.

omata 7. Nov 2010 11:07

AW: Betriebsstunden einer Festplatte auslesen?
 
Ok, wenn ihr dafür keine Adminrechte benötigt ist das ja ok. Wenn dann das Programm auch nicht fragt ist doch noch besser! Ich habe hier XP und da geht es nur mit Adminrechten. Wenn mein Benutzer diese hat, wird nicht gefragt und wenn er die benötigten Rechte nicht hat, wird danach gefragt und man kann sie sich durch eine entsprechende Anmeldung geben.

Ich fand die Erweiterung ganz sinnvoll, aber wenn sie nicht nötig ist, dann eben nicht.

@Bummi: Es hat noch niemand mein Beispiel heruntergeladen. Also vielleicht erst mal anschauen und dann rumblubbern.

Bummi 7. Nov 2010 11:49

AW: Betriebsstunden einer Festplatte auslesen?
 
@omata
ich hatte das Beispiel heruntergeladen und getestet, also nichts mit "rumblubbern".
Den Benutzerkontext fragt er bei mir auch nicht ab da ich bereits unter dem Adminkonto arbeite, mit Windows 7 ohne deaktivierte Benutzerkontensteuerung liefert das Programm kein Ergebnis, bei "Als Administror ausführen" schon.
Ich bleibe bei meiner Aussage und verbitte mit Anmerkungen wie "rumblubbern".

MfG
Thomas

toms 7. Nov 2010 11:54

AW: Betriebsstunden einer Festplatte auslesen?
 
Zitat:

Zitat von omata (Beitrag 1060167)
@Bummi: Es hat noch niemand mein Beispiel heruntergeladen.

Die Anzeige "XX aufgerufen" wird nicht immer aktualisiert - habe ich beim IE schon festgestellt.

omata 7. Nov 2010 12:00

AW: Betriebsstunden einer Festplatte auslesen?
 
Dann eben nicht, macht euren Mist doch allein. Habe es nur gut gemeint. Habe aber nun verstanden, das das ein Fehler war.

hathor 7. Nov 2010 15:25

AW: Betriebsstunden einer Festplatte auslesen?
 
Kleine Erweiterung: DRIVE INVALID, wenn keine S.M.A.R.T.-Daten gelesen werden können:

Delphi-Quellcode:
.
.
.
procedure TFMain.getDriveInfos(drive: Integer; Infos: TStrings);
var
  i: Integer;
begin
  Infos.Clear;
  ReadSMART;
  if SCOP[drive].attr[0].bAttrID =0 then
  Begin
    Infos.Append('Drive '+ IntToStr(drive)+': DRIVE INVALID');
    Exit;
  End;
  for i := 0 to 255 do
  begin
    if SCOP[drive].attr[i].bAttrID = ATTR_READ_ERROR_RATE then
    begin
      Infos.Append('Drive '+ IntToStr(drive)+': S.M.A.R.T. DATA'+#13#10);
      Infos.Append(Format(
        'ATTR_READ_ERROR_RATE: %s',
        [HexToStr(SCOP[drive].attr[i].Raw[0])]
        ));
    end;
    if SCOP[drive].attr[i].bAttrID = ATTR_POWER_ON_HRS_COUNT then
    begin
      Infos.Append(Format(
        'ATTR_POWER_ON_HRS_COUNT in hours: %d',
        [SCOP[drive].attr[i].Raw[0] + (SCOP[drive].attr[i].Raw[1] * 256)]
        ));
    end;
    if SCOP[drive].attr[i].bAttrID = ATTR_TEMPERATURE_CELCIUS then
    begin
      Infos.Append(Format(
        'ATTR_TEMPERATURE_CELCIUS: %d',
        [SCOP[drive].attr[i].Raw[0]]
        ));
    end;
  end;
end;

procedure TFMain.Button1Click(Sender: TObject);
begin
  getDriveInfos(0, MeInfo.Lines);
end;

procedure TFMain.Button2Click(Sender: TObject);
begin
  getDriveInfos(1, MeInfo.Lines);
end;

procedure TFMain.Button3Click(Sender: TObject);
begin
  getDriveInfos(2, MeInfo.Lines);
end;

procedure TFMain.Button4Click(Sender: TObject);
begin
  getDriveInfos(3, MeInfo.Lines);
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
  getDriveInfos(0, MeInfo.Lines);
end;

end.

Bummi 7. Nov 2010 15:37

AW: Betriebsstunden einer Festplatte auslesen?
 
ich trau mich ja gar nicht mehr, aber dann müßte es
Delphi-Quellcode:
    Infos.Append('Drive '+ IntToStr(drive)+': DRIVE INVALID or Missing administrative rights');
heißen

hathor 7. Nov 2010 16:06

AW: Betriebsstunden einer Festplatte auslesen?
 
Zitat:

Zitat von Bummi (Beitrag 1060239)
ich trau mich ja gar nicht mehr, aber dann müßte es
Delphi-Quellcode:
    Infos.Append('Drive '+ IntToStr(drive)+': DRIVE INVALID or Missing administrative rights');
heißen

Es geht hier aber nur um ATTR_INVALID = 0; - ob es bei Missing administrative rights
bis hierher kommt, ist zweifelhaft! Dafür braucht man eine andere Abfrage.
-----------------
Ich habe es mit WIN 7 64Bit getestet:
Ohne Aadministrative rights kommt man bis zu dieser Abfrage, was aber irreführend ist, denn diese
S.M.A.R.T.-Abfrage ist mit Aadministrative rights möglich.
Es müsste also VOR dem ATTR_INVALID = 0-Test eine Abfrage nach den Rechten erfolgen, dann ist dieser "Schönheitsfehler weg".

Bummi 7. Nov 2010 18:13

AW: Betriebsstunden einer Festplatte auslesen?
 
Du hast Recht, die Admin-Prüfung müßte bei
hSMARTIOCTL[i] := CreateFile(....
stattfinden


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz