-
Notifications
You must be signed in to change notification settings - Fork 0
/
DRMM-WUInvestigateAndRepair.ps1
151 lines (124 loc) · 5.79 KB
/
DRMM-WUInvestigateAndRepair.ps1
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
### Hacked together script for some broken Win Update installs
#Requires -Version 5.1
function Get-SFCLog {
# Get the path of the SFC log file
$log = "$env:windir\logs\cbs\cbs.log"
# Check if the log file exists
if (Test-Path $log) {
# Read the log file and filter the lines with [SR] tag
$lines = Get-Content $log | Where-Object {$_ -match "\[SR\]"}
# Get the last line with [SR] tag
$last = $lines[-1]
# Parse the date from the last line
$date = $last.Substring(0, 10)
# Rescan the output grabbing only information from the same date
$SfcLastRun = $lines | Where-Object {$_ -match "$date"}
} else {
# Write an error message to the console
$SfcLastRun = "The SFC log file does not exist."
}
Return $sfcLastrun
}
function Get-WinUpdateLog {
# Grab the Windows Update log
$UpdateLogPath = "C:\ProgramData\CentraStage\Temp\WindowsUpdate.log"
powershell "Get-WindowsUpdateLog -LogPath $updateLogPath" | Out-Null
# Check if the log file exists
if (Test-Path $UpdateLogPath) {
# Read the log file
$lines = Get-Content $UpdateLogPath
# Get the last line
$last = $lines[-1]
# Parse the date from the last line
$date = $last.Substring(0, 10)
# Rescan the output grabbing only information from the same date
$WULastRun = $lines | Where-Object {$_ -match "$date"}
} else {
# Write an error message to the console
$WULastRun = "The Windows Update log file does not exist or something failed while generating the log. Please manually review the machine."
}
return $WULastRun
}
function Get-DismLog {
# Grab the Windows Update log
$DismLogPath = "C:\Windows\Logs\DISM\dism.log"
#$DismUpdateLog = Get-WindowsUpdateLog -LogPath $updateLogPath -ErrorAction SilentlyContinue
# Check if the log file exists
if (Test-Path $DismLogPath) {
# Read the log file
$lines = Get-Content $DismLogPath
# Get the last line
$last = $lines[-1]
# Parse the date from the last line
$date = $last.Substring(0, 10)
# Rescan the output grabbing only information from the same date
$DismLastRun = $lines | Where-Object {$_ -match "$date"}
} else {
# Write an error message to the console
$DismLastRun = "The DISM log file does not exist. Please manually review the machine."
}
return $DismLastRun
}
#$ComputerInfo = Get-ComputerInfo
# Scan the Windows image using DISM
Write-Host "Scanning the Windows image using DISM..."
$scan = DISM /Online /Cleanup-Image /ScanHealth
# Check if the scan found any issues
if ($scan -match "The component store is repairable") {
Write-Host "The scan found some issues. Attempting to repair them..."
# Repair the Windows image using DISM
Write-Host "Repairing the Windows image using DISM..."
$repair = DISM /Online /Cleanup-Image /RestoreHealth
# Check if the repair was successful
if ($repair -match "The restore operation completed successfully") {
Write-Host "The repair was successful."
$DismSuccess = "Success"
}
else {
Write-Host "The repair failed. Please check the DISM log file for more details."
$DismSuccess = "Fail [WARNING]"
}
# Run the SFC /scannow command
Write-Host "Running the SFC /scannow command..."
$sfc = sfc /scannow
# Check if the SFC command found any issues
switch ($sfc) {
{$_ -match "Windows Resource Protection did not find any integrity violations"} {
Write-Host "The SFC command did not find any issues."
$SfcSuccess = "Success"
}
{$_ -match "Windows Resource Protection found corrupt files and successfully repaired them"} {
Write-Host "The SFC command found and repaired some issues."
$SfcSuccess = "Success"
}
{$_ -match "Windows Resource Protection found corrupt files but was unable to fix some of them"} {
Write-Host "The SFC command found some issues but could not repair them. Please check the CBS log file for more details."
$SfcSuccess = "Fail [WARNING]"
}
Default {
Write-Host "The SFC command failed. Please check the SFC log file for more details."
$SfcSuccess = "Fail [WARNING]"
}
}
# Final Output for repair operations
Write-Host "--------------------------------------------------------------------------------------------------------------"
Write-Host "-- Attempted repair complete."
Write-Host "-- DISM Repair: $DismSuccess"
Write-Host "-- SFC Repair: $SfcSuccess"
Write-Host "If either of the above report Fail, please review the diagnostic output"
Write-Host "--------------------------------------------------------------------------------------------------------------"
} else {
Write-Host "--------------------------------------------------------------------------------------------------------------"
Write-Host "The scan did not find any issues. No further action is required."
Write-Host "--------------------------------------------------------------------------------------------------------------"
}
Write-Host "------------------------------------------------DIAGNOSTIC----------------------------------------------------"
Write-Host "-- Windows Update Log"
Get-WinUpdateLog
Write-Host "--------------------------------------------------------------------------------------------------------------"
Write-Host "-- DISM Log"
Get-DismLog
Write-Host "--------------------------------------------------------------------------------------------------------------"
Write-Host "-- SFC Log"
Get-SFCLog
Write-Host "-----------------------------------------------------END------------------------------------------------------"