Establish comprehensive monitoring and develop a replacement strategy to prevent data loss from drive failure.
- Configure Windows Event Log forwarding for centralized monitoring:
# Configure event log subscription for Event ID 7
# On the collector server, create subscription XML
$SubscriptionXML = @'
<Subscription xmlns="http://schemas.microsoft.com/2006/03/windows/events/subscription">
<SubscriptionId>DiskErrorMonitoring</SubscriptionId>
<SubscriptionType>SourceInitiated</SubscriptionType>
<Description>Monitor Event ID 7 across all systems</Description>
<Enabled>true</Enabled>
<Uri>http://schemas.microsoft.com/wbem/wsman/1/windows/EventLog</Uri>
<ConfigurationMode>Custom</ConfigurationMode>
<Query>
<![CDATA[
<QueryList>
<Query Id="0">
<Select Path="System">*[System[EventID=7]]</Select>
</Query>
</QueryList>
]]>
</Query>
</Subscription>
'@
# Save and create subscription
$SubscriptionXML | Out-File -FilePath "C:\Temp\DiskErrorSubscription.xml"
wecutil cs "C:\Temp\DiskErrorSubscription.xml"
- Set up automated alerting for Event ID 7:
# Create PowerShell script for email alerts
$AlertScript = @'
param([string]$ComputerName, [string]$EventDetails)
$SMTPServer = "your-smtp-server.com"
$From = "alerts@yourcompany.com"
$To = "sysadmin@yourcompany.com"
$Subject = "CRITICAL: Disk Bad Block Detected on $ComputerName"
$Body = @"
Event ID 7 (Bad Block) detected on $ComputerName
Event Details:
$EventDetails
Immediate Action Required:
1. Check disk health status
2. Verify backup integrity
3. Consider disk replacement
4. Monitor for additional events
Generated: $(Get-Date)
"@
Send-MailMessage -SmtpServer $SMTPServer -From $From -To $To -Subject $Subject -Body $Body
'@
$AlertScript | Out-File -FilePath "C:\Scripts\DiskAlertScript.ps1"
- Create automated backup verification:
# Implement backup integrity checking
$BackupVerificationScript = @'
# Check Windows Backup status
Get-WBSummary | Format-List
# Verify backup locations are accessible
$BackupLocations = @("\\backup-server\backups", "D:\Backups")
foreach ($Location in $BackupLocations) {
if (Test-Path $Location) {
Write-Host "Backup location $Location is accessible" -ForegroundColor Green
$LatestBackup = Get-ChildItem $Location | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Write-Host "Latest backup: $($LatestBackup.Name) - $($LatestBackup.LastWriteTime)"
} else {
Write-Warning "Backup location $Location is not accessible"
}
}
# Check System State backup
wbadmin get versions -backupTarget:C:
'@
$BackupVerificationScript | Out-File -FilePath "C:\Scripts\BackupVerification.ps1"
- Establish drive replacement criteria:
# Create drive replacement assessment script
$ReplacementAssessment = @'
$CriticalThresholds = @{
MaxBadBlocks = 10
MaxTemperature = 60
MaxReadErrors = 100
MaxWriteErrors = 50
}
$PhysicalDisks = Get-PhysicalDisk
foreach ($Disk in $PhysicalDisks) {
$Reliability = Get-StorageReliabilityCounter -PhysicalDisk $Disk -ErrorAction SilentlyContinue
if ($Reliability) {
$ReplaceRecommended = $false
$Reasons = @()
if ($Reliability.ReadErrorsTotal -gt $CriticalThresholds.MaxReadErrors) {
$ReplaceRecommended = $true
$Reasons += "Excessive read errors: $($Reliability.ReadErrorsTotal)"
}
if ($Reliability.WriteErrorsTotal -gt $CriticalThresholds.MaxWriteErrors) {
$ReplaceRecommended = $true
$Reasons += "Excessive write errors: $($Reliability.WriteErrorsTotal)"
}
if ($Reliability.Temperature -gt $CriticalThresholds.MaxTemperature) {
$ReplaceRecommended = $true
$Reasons += "High temperature: $($Reliability.Temperature)°C"
}
[PSCustomObject]@{
DiskName = $Disk.FriendlyName
HealthStatus = $Disk.HealthStatus
ReplaceRecommended = $ReplaceRecommended
Reasons = $Reasons -join "; "
AssessmentDate = Get-Date
}
}
}
'@
$ReplacementAssessment | Out-File -FilePath "C:\Scripts\DriveReplacementAssessment.ps1"
Pro tip: Implement a three-tier response strategy: 1-5 Event ID 7 occurrences = increased monitoring, 6-15 occurrences = backup verification and replacement planning, 15+ occurrences = immediate replacement.