Salut !
J'essaie actuellement de récupérer les erreurs S.M.A.R.T. sur mes disques locaux, pour le moment coté valeurs/worst/threshold j'ai tout de bon, en revanche je galère un petit peu pour déterminer si un disque doit être considéré sur sa deadline ou non.
J'utilise WMI notamment la classe MSStorageDriver_FailurePredictStatus (http://www.scriptinternals.com/new/u...dictStatus.htm) qui possède une propriété PredictFailure sauf ça me renvoie toujours false même sur un disque sur sa fin.
De même, pour chaque ID des erreurs S.M.A.R.T, je ne vois pas comment déterminer si cette caractéristique est mauvaise comme le nombre de secteurs ré-alloués etc ...
Du coup j'ai un peu fouillé sur le net et j'ai trouvé ceci comme morceau de code (C#) :
Après il y a un moyen de savoir si un attribut est critique via ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // get wmi access to hdd var searcher = new ManagementObjectSearcher("Select * from Win32_DiskDrive"); searcher.Scope = new ManagementScope(@"\root\wmi"); // check if SMART reports the drive is failing searcher.Query = new ObjectQuery("Select * from MSStorageDriver_FailurePredictStatus"); iDriveIndex = 0; foreach (ManagementObject drive in searcher.Get()) { dicDrives[iDriveIndex].IsOK = (bool)drive.Properties["PredictFailure"].Value == false; // Toujours false qui est renvoyé iDriveIndex++; }
Globalement je comprends le code sans trop de problèmes, je pense que mon manque de connaissances vient du coté de WMI, j'ai essayé sur un disque sain et un autre avec des erreurs mais dans ce dernier cas il ne me prévient pas du tout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 // retrive attribute flags, value worste and vendor data information searcher.Query = new ObjectQuery("Select * from MSStorageDriver_FailurePredictData"); iDriveIndex = 0; foreach (ManagementObject data in searcher.Get()) { Byte[] bytes = (Byte[])data.Properties["VendorSpecific"].Value; for (int i = 0; i < 30; ++i) { try { int id = bytes[i*12 + 2]; int flags = bytes[i * 12 + 4]; // least significant status byte, +3 most significant byte, but not used so ignored. //bool advisory = (flags & 0x1) == 0x0; bool failureImminent = (flags & 0x1) == 0x1; // Ici //bool onlineDataCollection = (flags & 0x2) == 0x2; int value = bytes[i*12 + 5]; int worst = bytes[i*12 + 6]; int vendordata = BitConverter.ToInt32(bytes, i*12 + 7); if (id == 0) continue; var attr = dicDrives[iDriveIndex].Attributes[id]; attr.Current = value; attr.Worst = worst; attr.Data = vendordata; attr.IsOK = failureImminent == false; } catch { // given key does not exist in attribute collection (attribute not in the dictionary of attributes) } } iDriveIndex++; }
Une idée de comment je pourrai interpréter ça et/ou le mettre en place ? Merci.
Partager