Marco Burmeister
private Homepage
Da ich letztens wieder einmal den Fall hatte, dass bei meinem alten Rechner eine Festplatte ausgefallen ist, ohne dass ich davon vorher eine Vorwarnung wahrgenommen habe,
habe ich mich entschlossen, automatisiert festzustellen, wie der Status eine Festplatte ist.
Mein Problem bei meiner anschließenden Recherche war, dass ich kein Programm gefunden habe, welches mich automatisiert bei einer Anmeldung warnt.
Ich wollte nicht interaktiv abfragen. Das funktioniert natürlich, aber als Nutzer muss ich auch daran denken.
Im Ergebnis habe ich mich dann ein wenig mit dem S.M.A.R.T. System beschäftigt
(Wikipedia: Self-Monitoring, Analysis and Reporting Technology).
Die Seite ist in die folgenden Bereiche eingeteilt:
Hinweis:
Die Nutzung der hier geschilderten Anleitung geschieht auf eigene Gefahr!
Bei der Recherche zum Auslesen der S.M.A.R.T. - Werte von Festplatten (SSD und HDD) habe ich kein Tool gefunden, welches mir gleich nach der Anmeldung eine Info ausgibt,
wie der Zustand der Festplatte ist.
Deshalb habe ich dann recherchiert, wie ich mit Powershell für Windows und Linux bash-Befehlen für Linux an die notwendigen Informationen komme, um sie dann anzuzeigen.
Im Ergebnis habe ich nun für Windows und Linux Scripte erstellt, die mir nach der Anmeldung die Information ohne eigenes Zutun anzeigt.
c:\Scripts\SMART_check
c:\Scripts\SMART_check\log
Administratorengruppe
erhalten kann,
aber selbst selten mit einem solchen Benutzer arbeite.
log
dann immer vom letzten Lauf das Ergebnis abgelegt.
c:\Scripts\SMART_check
.
Die .bat
Scripte dienen nur dazu, dass die Scripte auch auf Systemen ausgeführt werden müssen, die das Ausführen von Powershell Scripten verhindern / untersagen.
SMART_check_disks.bat
ist nur ein Hilfsscript, damit das Powershell-Script ausgeführt werden kan.
- @echo off
- @REM
- @REM - ausfuehren als Administrator!
- @REM
- powershell -ExecutionPolicy RemoteSigned -File c:\Scripts\SMART_check\SMART_check_disks.ps1
SMART_just_read_and_send_message.bat
ist nur ein Hilfsscript, damit das Powershell-Script ausgeführt werden kan.
- @echo off
- @REM
- @REM - ausfuehren als Benutzer!
- @REM
- powershell -ExecutionPolicy RemoteSigned -File c:\Scripts\SMART_check\SMART_just_read_and_send_message.ps1
SMART_check_disks.ps1
macht die Auswertung des Diskstatus mittels Powershell und schreibt die Log-Datei.
- #
- # PowerShell Script - Check S.M.A.R.T
- # (PS-Script als User Administrator ausfuehren!)
- #
- # Variablen
- # Wert
- $wert = ""
- # Diskname
- $diskall = ""
- $diskname = ""
- # Ausgabe
- $ausgabe = ""
- # WShell
- $wshell = ""
- # Flag erster Eintrag
- $flerst = 0
- # Konstante
- # Status S.M.A.R.T (TRUE / FALSE) - TRUE = Fehler
- $c_status = "True"
- # Verzeichnis Ausgabe
- $c_verz = "c:\Scripts\SMART_check\log"
- # Log-Ausgabe
- $c_logdat = $c_verz + "\smart_check.log"
- # Flag-File Fehler
- $c_errdat = $c_verz + "\smart_check.err"
- # Log-Ausgabe - alle Disks
- $c_logfulldat = $c_verz + "\smart_check_full_output.log"
- # Init
- # Directory anlegen
- new-item -itemtype directory -path $c_verz -Force | Out-Null
- # Init - Loeschen ERR-Flag-File
- if ( Test-Path -Path $c_errdat -PathType Leaf ) {
- Remove-item $c_errdat | Out-Null
- }
- # Init - Loeschen Log-File
- if ( Test-Path -Path $c_logdat -PathType Leaf ) {
- Remove-item $c_logdat | Out-Null
- }
- #
- # Verarbeitung 1
- #
- # Zaehlen Disks mit Fehler Status
- $wert=Get-CimInstance -namespace root\wmi -class MSStorageDriver_FailurePredictStatus | Select-Object PredictFailure | Select-String $c_status | Measure-Object
- # Anzeige Bildschirm
- if ( $wert.count -gt 0 ) {
- # Alle Disks
- $diskall=Get-CimInstance -namespace root\wmi -class MSStorageDriver_FailurePredictStatus |Select-Object InstanceName,PredictFailure | Where-Object { $_.PredictFailure -match $c_status } | Select-Object InstanceName
- # Anzeige
- foreach ($diskname in $diskall) {
- Add-Type -AssemblyName System.Windows.Forms
- $global:balloon = New-Object System.Windows.Forms.NotifyIcon
- $path = (Get-Process -id $pid).Path
- $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
- $balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
- $balloon.BalloonTipText = "S.M.A.R.T - Disk Failure near for disk '$diskname'"
- $balloon.BalloonTipTitle = "Attention $Env:USERNAME"
- $balloon.Visible = $true
- $balloon.ShowBalloonTip(5000)
- # Ausgabe als File
- if ( Test-Path -Path $c_verz ) {
- if ( $flerst -eq 0 ) {
- $flerst = 1
- Start-Transcript -Path $c_logdat -Append
- write-host "SMART - Problematic disks:"
- write-host "=========================="
- }
- # Ausgabe fehlerhafte Disks in Log-Datei
- write-host "S.M.A.R.T - Disk Failure near for disk '$diskname'"
- }
- }
- }
- #
- # Verarbeitung 2
- #
- # Zaehlen Disks mit Fehler Status
- $wert=Get-Disk | Select-Object Number | get-disk -number { $_.Number } | Select-Object "Healthstatus" | Select-String "Healthy" -NotMatch | Measure-Object
- # Anzeige Bildschirm
- if ( $wert.count -gt 0 ) {
- # Start
- if ( Test-Path -Path $c_verz ) {
- if ( $flerst -eq 0 ) {
- $flerst = 1
- Start-Transcript -Path $c_logdat -Append
- write-host "SMART - Problematic disks:"
- write-host "=========================="
- }
- }
- # Output Error-Message Indicator
- write-host "S.M.A.R.T - Disk Failure near for disk - see output of get-disk from log file"
- }
- # Ende und Errorflag
- if ( $flerst -eq 1) {
- # Ende Ausgabe
- Stop-Transcript | Out-Null
-
- # Error-Flag File
- write-output "S.M.A.R.T - Disk Failure detected on $(Get-Date -Format d.M.yyyy) $((Get-Date).ToShortTimeString())" | Out-File -FilePath $c_errdat
- }
- #
- # Alle Disks ausgeben - nur zur Dokumentation
- #
- Get-CimInstance -namespace root\wmi -class MSStorageDriver_FailurePredictStatus | Out-File -FilePath $c_logfulldat
- wmic diskdrive get caption,status,serialnumber,pnpdeviceid | Out-File -Append -FilePath $c_logfulldat
- Get-Disk | Get-StorageReliabilityCounter | Out-File -Append -FilePath $c_logfulldat
- Get-Disk | Select-Object Number | get-disk -number { $_.Number } | Format-Custom | Out-File -Append -FilePath $c_logfulldat
Get-Disk | Get-StorageReliabilityCounter
in meinem Script nicht aus, da ich für meine SSD hier keine Werte erhalte und nur meine
alte Festplatte (HDD) hier Werte anzeigt.
SMART_just_read_and_send_message.ps1
schickt für den Benutzer, der nicht Teil der Gruppe der Administratoren ist, die Ergebnisse,
die das Script mit Administratoren-Rechten ermittelt hat, an das Benachrichtigungssystem von Windows.
- #
- # PowerShell Script - Check S.M.A.R.T
- #
- # Scheduled Task
- # https://serverfault.com/questions/631995/program-does-not-run-properly-as-scheduled-task
- # Konstanten
- # Verzeichnis Ausgabe
- $c_verz = "C:\Scripts\SMART_Check\log"
- # Log-Ausgabe
- $c_logdat = $c_verz + "\smart_check.log"
- # Suchstring
- $c_suchstr = "S.M.A.R.T"
- # Verarbeitung
- if ( Test-Path -Path $c_logdat -PathType Leaf ) {
- write-host "Log-Datei '$c_logdat' gefunden."
- write-host "Schicke Meldungen an Windows Notification System"
- foreach($line in Get-Content $c_logdat) {
- if($line -match $c_suchstr){
- write-host "$line"
- Add-Type -AssemblyName System.Windows.Forms
- $global:balloon = New-Object System.Windows.Forms.NotifyIcon
- $path = (Get-Process -id $pid).Path
- $balloon.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
- $balloon.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
- $balloon.BalloonTipText = "$line'"
- $balloon.BalloonTipTitle = "Attention $Env:USERNAME"
- $balloon.Visible = $true
- $balloon.ShowBalloonTip(5000)
- }
- }
- } else {
- write-host "Keine Log-Datei '$c_logdat' gefunden."
- write-host "Keine problematischen Disks gefunden."
- }
powershell -ExecutionPolicy RemoteSigned -File C:\Scripts\SMART_Check\SMART_check_disks.ps1
powershell -WindowStyle hidden -ExecutionPolicy RemoteSigned -File C:\Scripts\SMART_Check\SMART_just_read_and_send_message.ps1
powershell -WindowStyle hidden -ExecutionPolicy RemoteSigned -File C:\Scripts\SMART_Check\SMART_check_disks.ps1
/root
ein Script abgelegt.
.profile
oder .bashrc
kann das u.a. Script /root/smart_check.sh
eingetragen werden werden, damit
gleich nach der Anmeldung des root
-Users der Status der Festplatten ausgegeben wird.
smart_check.sh
.
- #!/bin/bash
- #
- # SMARTCTL Check Disk Status
- #
- # Variablen
- # Zaehlen Ausgabe smartctl
- v_cnt=0
- # Disks
- v_disk=""
- # flag Fehler gefunden
- fl_fehler=0
- # Konstanten
- # Pre-String Disk
- c_predisk="/dev/"
- # Einschraenkungsstring
- c_strgrep="overall-health"
- # String Suche Erfolg
- c_strok="PASSED"
- #
- # Verarbeitung
- #
- # Start
- echo "##############################################"
- echo "S.M.A.R.T. - Auswertung"
- echo "##############################################"
- # Analyse
- for v_disk in $( lsblk |grep disk | cut -d " " -f1)
- do
- v_cnt=$(smartctl -H ${c_predisk}${v_disk} | grep "${c_strgrep}" | grep "${c_strok}" | wc -l)
- if [ "${v_cnt}" -le 0 ];
- then
- # Fehler
- fl_fehler=1
- # Ausgabe
- echo "*************"
- echo "S.M.A.R.T. - Check fuer ${c_predisk}${v_disk}"
- echo "fehlgeschlagen."
- smartctl -H ${c_predisk}${v_disk}
- echo "*************"
- else
- echo "Disk ${c_predisk}${v_disk} ohne Befund."
- fi
- done
- # Ausgabe wenn kein Fehler und Ende
- if [ "${fl_fehler}" -eq 1 ];
- then
- echo "##############################################"
- exit 5
- else
- echo "Alles OK"
- echo "##############################################"
- exit 0
- fi
Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!
Für den Inhalt von Internet-Seiten, auf die von dieser Seite verwiesen wird, übernehme ich keine Verantwortung!
Marco Burmeister, Copyright © 2022 - 2023
zuletzt geändert: 2023-04-10
URL: https://www.marco-burmeister.de/helferlein/de_smart_windows_linux_anzeige_fehlerstatus.html
Impressum