|
<# |
|
.SYNOPSIS |
|
Reset-WindowsUpdate.ps1 - Resets the Windows Update components |
|
|
|
.DESCRIPTION |
|
This script will reset all of the Windows Updates components to DEFAULT SETTINGS. |
|
|
|
.OUTPUTS |
|
Results are printed to the console. Future releases will support outputting to a log file. |
|
|
|
.NOTES |
|
Written by: Ryan Nemeth |
|
|
|
Find me on: |
|
|
|
* My Blog: http://www.geekyryan.com |
|
* Twitter: https://twitter.com/geeky_ryan |
|
* LinkedIn: https://www.linkedin.com/in/ryan-nemeth-b0b1504b/ |
|
* Github: https://github.com/rnemeth90 |
|
* TechNet: https://social.technet.microsoft.com/profile/ryan%20nemeth/ |
|
|
|
Change Log |
|
V1.00, 05/21/2015 - Initial version |
|
V1.10, 09/22/2016 - Fixed bug with call to sc.exe |
|
V1.20, 11/13/2017 - Fixed environment variables |
|
#> |
|
|
|
|
|
$arch = Get-WMIObject -Class Win32_Processor -ComputerName LocalHost | Select-Object AddressWidth |
|
|
|
Write-Host "1. Stopping Windows Update Services..." |
|
Stop-Service -Name BITS |
|
Stop-Service -Name wuauserv |
|
Stop-Service -Name appidsvc |
|
Stop-Service -Name cryptsvc |
|
|
|
Write-Host "2. Remove QMGR Data file..." |
|
Remove-Item "$env:allusersprofile\Application Data\Microsoft\Network\Downloader\qmgr*.dat" -ErrorAction SilentlyContinue |
|
|
|
Write-Host "3. Renaming the Software Distribution and CatRoot Folder..." |
|
Rename-Item $env:systemroot\SoftwareDistribution SoftwareDistribution.bak -ErrorAction SilentlyContinue |
|
Rename-Item $env:systemroot\System32\Catroot2 catroot2.bak -ErrorAction SilentlyContinue |
|
|
|
Write-Host "4. Removing old Windows Update log..." |
|
Remove-Item $env:systemroot\WindowsUpdate.log -ErrorAction SilentlyContinue |
|
|
|
Write-Host "5. Resetting the Windows Update Services to defualt settings..." |
|
"sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)" |
|
"sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)" |
|
|
|
Set-Location $env:systemroot\system32 |
|
|
|
Write-Host "6. Registering some DLLs..." |
|
regsvr32.exe /s atl.dll |
|
regsvr32.exe /s urlmon.dll |
|
regsvr32.exe /s mshtml.dll |
|
regsvr32.exe /s shdocvw.dll |
|
regsvr32.exe /s browseui.dll |
|
regsvr32.exe /s jscript.dll |
|
regsvr32.exe /s vbscript.dll |
|
regsvr32.exe /s scrrun.dll |
|
regsvr32.exe /s msxml.dll |
|
regsvr32.exe /s msxml3.dll |
|
regsvr32.exe /s msxml6.dll |
|
regsvr32.exe /s actxprxy.dll |
|
regsvr32.exe /s softpub.dll |
|
regsvr32.exe /s wintrust.dll |
|
regsvr32.exe /s dssenh.dll |
|
regsvr32.exe /s rsaenh.dll |
|
regsvr32.exe /s gpkcsp.dll |
|
regsvr32.exe /s sccbase.dll |
|
regsvr32.exe /s slbcsp.dll |
|
regsvr32.exe /s cryptdlg.dll |
|
regsvr32.exe /s oleaut32.dll |
|
regsvr32.exe /s ole32.dll |
|
regsvr32.exe /s shell32.dll |
|
regsvr32.exe /s initpki.dll |
|
regsvr32.exe /s wuapi.dll |
|
regsvr32.exe /s wuaueng.dll |
|
regsvr32.exe /s wuaueng1.dll |
|
regsvr32.exe /s wucltui.dll |
|
regsvr32.exe /s wups.dll |
|
regsvr32.exe /s wups2.dll |
|
regsvr32.exe /s wuweb.dll |
|
regsvr32.exe /s qmgr.dll |
|
regsvr32.exe /s qmgrprxy.dll |
|
regsvr32.exe /s wucltux.dll |
|
regsvr32.exe /s muweb.dll |
|
regsvr32.exe /s wuwebv.dll |
|
|
|
Write-Host "7) Removing WSUS client settings..." |
|
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v AccountDomainSid /f |
|
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v PingID /f |
|
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f |
|
|
|
Write-Host "8) Resetting the WinSock..." |
|
netsh winsock reset |
|
netsh winhttp reset proxy |
|
|
|
Write-Host "9) Delete all BITS jobs..." |
|
Get-BitsTransfer | Remove-BitsTransfer |
|
|
|
Write-Host "10) Attempting to install the Windows Update Agent..." |
|
if($arch -eq 64){ |
|
wusa Windows8-RT-KB2937636-x64 /quiet |
|
} |
|
else{ |
|
wusa Windows8-RT-KB2937636-x86 /quiet |
|
} |
|
|
|
Write-Host "11) Starting Windows Update Services..." |
|
Start-Service -Name BITS |
|
Start-Service -Name wuauserv |
|
Start-Service -Name appidsvc |
|
Start-Service -Name cryptsvc |
|
|
|
Write-Host "12) Forcing discovery..." |
|
wuauclt /resetauthorization /detectnow |
|
|
|
Write-Host "Process complete. Please reboot your computer." |
The reason why I left it as a code snippet instead of a repository, is because if I'd had it as a repo, it would of given the false impression that the code is still being maintained (either by Ryan Nemeth or me after newly adopting it).
If the wrong impression is given, the user would incorrectly assume that the code (or batch script) has been fully tested on the modern environment of Windows 10 within the adverse practical scenario of Windows Update not working. Emphasis on adverse practical scenario, not adverse technical scenario.
By the way, in programming, there is "case driven design", "domain driven design" and what I like to call "stage driven design". I think the question is not only asking "does it work?" on a computer where Windows Update already works but to also ask "does it fix it?" on a computer where Windows Update is currently faulty. As I think that the above code doesn't match the relevant corresponding "use case", I wouldn't consider it case driven design on Windows 10 as I now think it's outdated and redundant, as stated by my earlier comment when I said the code doesn't work for me on Windows 10.