Function global:Fix-WindowsScriptingComponents { ## List of all scripting component DLL files $DLL_FILES = @("${Env:WINDIR}\system32\vbscript.dll", "${Env:WINDIR}\system32\jscript.dll", "${Env:WINDIR}\system32\dispex.dll", "${Env:WINDIR}\system32\scrobj.dll", "${Env:WINDIR}\system32\scrrun.dll", "${Env:WINDIR}\system32\wshext.dll" "${Env:WINDIR}\system32\wshom.ocx", "${Env:WINDIR}\syswow64\vbscript.dll", "${Env:WINDIR}\syswow64\jscript.dll", "${Env:WINDIR}\syswow64\dispex.dll", "${Env:WINDIR}\syswow64\scrobj.dll", "${Env:WINDIR}\syswow64\scrrun.dll", "${Env:WINDIR}\syswow64\wshext.dll", "${Env:WINDIR}\syswow64\wshom.ocx") ## Unregister all DLLs ForEach ($dll in $DLL_FILES) { If ( Test-Path $dll ) { If ( $dll -Match "syswow64" ) { $REGSVR32 = "${Env:WINDIR}\syswow64\regsvr32" } Else { $REGSVR32 = "regsvr32" } Start-Process "${REGSVR32}" -ArgumentList "/u /s ${dll}" -Wait } } ## Register all DLLs ForEach ($dll in $DLL_FILES) { If ( Test-Path $dll ) { If ( $dll -Match "syswow64" ) { $REGSVR32 = "${Env:WINDIR}\syswow64\regsvr32" } Else { $REGSVR32 = "regsvr32" } Start-Process "${REGSVR32}" -ArgumentList "/s ${dll}" -Wait } } } Function global:Fix-SystemPrintQueue { ## Make sure the spooler service isn't already stopped If ( (Get-Service -Name spooler).Status -ne "Stopped" ) { ## Forcefully stop the spooler service Stop-Service -Name spooler -Force ## Wait a few seconds to make sure it's stopped Start-Sleep -Seconds 5 } ## Check to make sure the spooler service has stopped If ((Get-Service -Name spooler).Status -eq "Stopped") { ## Delete all print jobs, including secure prints Remove-Item "${Env:WINDIR}\System32\spool\PRINTERS\*" -Recurse ## Start the spooler service again Start-Service -Name spooler } ## If the spooler service didn't stop on time, just return an error Else { Write-Output "Could not clean ${Env:WINDIR}\System32\spool\PRINTERS\* because spooler service is running." } } Function global:Fix-WindowsUpdate { param([switch]$WSUS) ## Delete any existing folder from a previous execution of this script If ( Test-Path "${Env:WinDir}\SoftwareDistribution.old" ) { Remove-Item "${Env:WinDir}\SoftwareDistribution.old" -Recurse -Force } ## Stop Background Intelligent Transfer Services and Windows Update Stop-Service BITS Stop-Service wuauserv ## Rename the SoftwareDistribution folder, forcing Windows Update to recreate all metrics and redownload all updates Rename-Item -Path "${Env:WinDir}\SoftwareDistribution" -NewName "${Env:WinDir}\SoftwareDistribution.old" -Force ## Start Windows Update and Background Intelligent Transfer Services Start-Service wuauserv Start-Service BITS ## Delete SoftwareDistribution.old from this execution of this script If ( Test-Path "${Env:WinDir}\SoftwareDistribution.old" ) { Remove-Item "${Env:WinDir}\SoftwareDistribution.old" -Recurse -Force } ## If using WSUS, reset authorization with server and detect new updates If ( $WSUS ) { Start-Process "${Env:WinDir}\System32\wuauctl.exe" -ArgumentList "/resetauthorization /detectnow" } }