Private/Invoke-WUComprehensiveRemediation.ps1
function Invoke-WUComprehensiveRemediation { <# .SYNOPSIS Performs comprehensive Windows Update remediation when specific issues are unclear. .DESCRIPTION Runs multiple remediation actions in sequence when SetupDiag detects upgrade failures but the specific cause is unclear. This is the "comprehensive" approach that addresses multiple potential causes of Windows Update failures. .PARAMETER LogPath Path to the log file for detailed logging. .EXAMPLE $result = Invoke-WUComprehensiveRemediation -LogPath "C:\Logs\wu.log" .NOTES This is a private function used internally by the WindowsUpdateTools module. Performs multiple remediation actions and returns combined results. #> [CmdletBinding()] param( [string]$LogPath ) Write-WULog -Message "Starting comprehensive Windows Update remediation" -LogPath $LogPath # Initialize comprehensive results $results = [PSCustomObject]@{ Success = $false ActionsPerformed = @() IssuesResolved = 0 RebootRequired = $false RemediationErrors = 0 ComponentResults = @{} ErrorMessage = $null } try { Write-WULog -Message "Comprehensive remediation sequence initiated for unclear upgrade failure" -LogPath $LogPath # Step 1: Windows Update Troubleshooter Write-WULog -Message "Step 1: Running Windows Update troubleshooter..." -LogPath $LogPath try { $troubleshooterResult = Invoke-WUTroubleshooter -LogPath $LogPath $results.ComponentResults["Troubleshooter"] = $troubleshooterResult if ($troubleshooterResult.Success) { $results.ActionsPerformed += "Windows Update Troubleshooter" if ($troubleshooterResult.IssuesResolved -gt 0) { $results.IssuesResolved += $troubleshooterResult.IssuesResolved } } } catch { Write-WULog -Message "Windows Update troubleshooter failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 2: Component Store Repair Write-WULog -Message "Step 2: Component store repair..." -LogPath $LogPath try { $componentResult = Resolve-WUComponentStore -LogPath $LogPath $results.ComponentResults["ComponentStore"] = $componentResult if ($componentResult.Success) { $results.ActionsPerformed += "Component Store Repair" $results.IssuesResolved++ if ($componentResult.RebootRequired) { $results.RebootRequired = $true } } } catch { Write-WULog -Message "Component store repair failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 3: System Reserved Partition Cleanup Write-WULog -Message "Step 3: System Reserved Partition cleanup..." -LogPath $LogPath try { $partitionResult = Resolve-WUSystemPartition -LogPath $LogPath $results.ComponentResults["SystemPartition"] = $partitionResult if ($partitionResult.Success) { $results.ActionsPerformed += "System Reserved Partition Cleanup" if ($partitionResult.SpaceFreed -gt 0) { $results.IssuesResolved++ } } } catch { Write-WULog -Message "System Reserved Partition cleanup failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 4: Driver Cleanup (Problematic Drivers) Write-WULog -Message "Step 4: Problematic driver cleanup..." -LogPath $LogPath try { $driverResult = Remove-WUProblematicDrivers -LogPath $LogPath $results.ComponentResults["DriverCleanup"] = $driverResult if ($driverResult.Success) { $results.ActionsPerformed += "Problematic Driver Cleanup" if ($driverResult.DriversRemoved -gt 0) { $results.IssuesResolved++ $results.RebootRequired = $true } } } catch { Write-WULog -Message "Driver cleanup failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 5: Registry Cleanup (Upgrade Blocking) Write-WULog -Message "Step 5: Registry cleanup..." -LogPath $LogPath try { $registryResult = Clear-WUUpgradeBlockingRegistry -LogPath $LogPath $results.ComponentResults["RegistryCleanup"] = $registryResult if ($registryResult.Success) { $results.ActionsPerformed += "Registry Cleanup" if ($registryResult.EntriesCleared -gt 0) { $results.IssuesResolved++ } } } catch { Write-WULog -Message "Registry cleanup failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 6: Enhanced Disk Cleanup Write-WULog -Message "Step 6: Enhanced disk cleanup..." -LogPath $LogPath try { $diskCleanupResult = Invoke-WUEnhancedDiskCleanup -LogPath $LogPath $results.ComponentResults["DiskCleanup"] = $diskCleanupResult if ($diskCleanupResult.Success) { $results.ActionsPerformed += "Enhanced Disk Cleanup" if ($diskCleanupResult.SpaceFreed -gt 0) { $results.IssuesResolved++ } } } catch { Write-WULog -Message "Enhanced disk cleanup failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 7: WSUS Issues Resolution Write-WULog -Message "Step 7: WSUS issues resolution..." -LogPath $LogPath try { $wsusResult = Resolve-WUWSUSIssues -LogPath $LogPath $results.ComponentResults["WSUSFix"] = $wsusResult if ($wsusResult.Success) { $results.ActionsPerformed += "WSUS Issues Resolution" if ($wsusResult.IssuesFixed -gt 0) { $results.IssuesResolved++ } } } catch { Write-WULog -Message "WSUS issues resolution failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Step 8: Final Windows Update Service Reset Write-WULog -Message "Step 8: Final Windows Update service reset..." -LogPath $LogPath try { $serviceResult = Resolve-WUGenericErrors -LogPath $LogPath $results.ComponentResults["ServiceReset"] = $serviceResult if ($serviceResult.Success) { $results.ActionsPerformed += "Windows Update Service Reset" $results.IssuesResolved++ if ($serviceResult.RebootRequired) { $results.RebootRequired = $true } } } catch { Write-WULog -Message "Service reset failed: $($_.Exception.Message)" -Level Warning -LogPath $LogPath $results.RemediationErrors++ } # Determine overall success if ($results.ActionsPerformed.Count -gt 0 -and $results.RemediationErrors -lt ($results.ActionsPerformed.Count / 2)) { $results.Success = $true Write-WULog -Message "Comprehensive remediation completed with success" -LogPath $LogPath } else { Write-WULog -Message "Comprehensive remediation completed with limited success" -Level Warning -LogPath $LogPath } } catch { $results.ErrorMessage = $_.Exception.Message Write-WULog -Message "Critical error during comprehensive remediation: $($_.Exception.Message)" -Level Error -LogPath $LogPath } # Summary Write-WULog -Message "Comprehensive remediation summary:" -LogPath $LogPath Write-WULog -Message " Actions performed: $($results.ActionsPerformed.Count)" -LogPath $LogPath Write-WULog -Message " Issues resolved: $($results.IssuesResolved)" -LogPath $LogPath Write-WULog -Message " Remediation errors: $($results.RemediationErrors)" -LogPath $LogPath Write-WULog -Message " Reboot required: $($results.RebootRequired)" -LogPath $LogPath Write-WULog -Message " Overall success: $($results.Success)" -LogPath $LogPath if ($results.ActionsPerformed.Count -gt 0) { Write-WULog -Message "Actions completed:" -LogPath $LogPath foreach ($action in $results.ActionsPerformed) { Write-WULog -Message " - $action" -LogPath $LogPath } } return $results } |