Skip to content

Instantly share code, notes, and snippets.

@Albirew
Last active March 14, 2017 23:50
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Albirew/1a4bcc5e39323a9c2655 to your computer and use it in GitHub Desktop.
Save Albirew/1a4bcc5e39323a9c2655 to your computer and use it in GitHub Desktop.
Remove shitty Windows 10 upgrade notification from your W7-W8.1 computer
@echo off
:: Writed by CynerOne, updated and commented by Albirew
:: CynerOne original located here: http://lecrabeinfo.net/desinstaller-lapplication-obtenir-windows-10-supprimer-icone-windows-10.html#comment-2374542969
:: also added rev.18 of Matt's privilege escalation script: http://stackoverflow.com/posts/12264592/revisions
:: V2 added Inny suggestion: http://www.nextinpact.com/news/97735-microsoft-se-fait-plus-insistant-sur-migration-vers-windows-10.htm#/comment/5555097
:: V3 added Timo's list: http://lehollandaisvolant.net/?d=2016/01/16/13/29/06-windows-78-bloquer-les-mises-a-niveau-vers-windows-10
:: V4 escaped chevrons inside echo (my bad)
:: V5 reordered updates removal by kb number for readability and added some of isleaked updates: https://fix10.isleaked.com/oldwindows.html
:: V6 modified error check to make it not stop when non fatal error occur and added script to automatically hide nasty updates on Windows Update ( https://gist.github.com/neckcen/f099eda0b1cde283cdc9 )
:: V7 added WGA update and fixed lack of escaping characters
:: V8 added KB3173040
:: before anything, let's specify what "yes" is interpreted in your language (for takeown)
for /F "tokens=3 delims= " %%G in ('reg query "hklm\system\controlset001\control\nls\language" /v Installlanguage') do (
if [%%G] equ [040C] ( set yes=o ) else ( set yes=y )
)
:: First, we escalate privileges of the terminal
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
echo.
echo Invoking UAC for Privilege Escalation
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
echo args = "ELEV " >> "%temp%\OEgetPrivileges.vbs"
echo For Each strArg in WScript.Arguments >> "%temp%\OEgetPrivileges.vbs"
echo args = args ^& strArg ^& " " >> "%temp%\OEgetPrivileges.vbs"
echo Next >> "%temp%\OEgetPrivileges.vbs"
echo UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs" %*
exit /B
:gotPrivileges
if '%1'=='ELEV' shift /1
setlocal & pushd .
cd /d %~dp0
:: privilege escalation OK
:: this is the hide update script here
echo If Wscript.Arguments.Count ^< 1 Then > "%temp%\banUpdate.vbs"
echo WScript.Echo "Syntax: HideWindowsUpdates.vbs [KB1] [KB2] ..." ^& vbCRLF ^& _ >> "%temp%\banUpdate.vbs"
echo " - Example1: HideWindowsUpdates.vbs 3035583" ^& vbCRLF ^& _ >> "%temp%\banUpdate.vbs"
echo " - Example2: HideWindowsUpdates.vbs 3035583 3012973" >> "%temp%\banUpdate.vbs"
echo WScript.Quit 1 >> "%temp%\banUpdate.vbs"
echo End If >> "%temp%\banUpdate.vbs"
echo. >> "%temp%\banUpdate.vbs"
echo Dim objArgs >> "%temp%\banUpdate.vbs"
echo Set objArgs = Wscript.Arguments >> "%temp%\banUpdate.vbs"
echo Dim updateSession, updateSearcher >> "%temp%\banUpdate.vbs"
echo Set updateSession = CreateObject("Microsoft.Update.Session") >> "%temp%\banUpdate.vbs"
echo Set updateSearcher = updateSession.CreateUpdateSearcher() >> "%temp%\banUpdate.vbs"
echo. >> "%temp%\banUpdate.vbs"
echo WScript.Echo "Searching for pending updates..." >> "%temp%\banUpdate.vbs"
echo Dim searchResult >> "%temp%\banUpdate.vbs"
echo Set searchResult = updateSearcher.Search("IsInstalled=0") >> "%temp%\banUpdate.vbs"
echo. >> "%temp%\banUpdate.vbs"
echo Dim update, kbArticleId, index, index2 >> "%temp%\banUpdate.vbs"
echo WScript.Echo CStr(searchResult.Updates.Count) ^& " found." >> "%temp%\banUpdate.vbs"
echo For index = 0 To searchResult.Updates.Count - 1 >> "%temp%\banUpdate.vbs"
echo Set update = searchResult.Updates.Item(index) >> "%temp%\banUpdate.vbs"
echo For index2 = 0 To update.KBArticleIDs.Count - 1 >> "%temp%\banUpdate.vbs"
echo kbArticleId = update.KBArticleIDs(index2) >> "%temp%\banUpdate.vbs"
echo. >> "%temp%\banUpdate.vbs"
echo For Each hotfixId in objArgs >> "%temp%\banUpdate.vbs"
echo If kbArticleId = hotfixId Then >> "%temp%\banUpdate.vbs"
echo If update.IsHidden = False Then >> "%temp%\banUpdate.vbs"
echo WScript.Echo "Hiding update: " ^& update.Title >> "%temp%\banUpdate.vbs"
echo update.IsHidden = True >> "%temp%\banUpdate.vbs"
echo Else >> "%temp%\banUpdate.vbs"
echo WScript.Echo "Already hidden: " ^& update.Title >> "%temp%\banUpdate.vbs"
echo End If >> "%temp%\banUpdate.vbs"
echo End If >> "%temp%\banUpdate.vbs"
echo Next >> "%temp%\banUpdate.vbs"
echo Next >> "%temp%\banUpdate.vbs"
echo Next >> "%temp%\banUpdate.vbs"
:: EOF
color 0a
echo GWX / GWX Schedule / Windows spy updates search ^& destroy
echo ----------------------------------------------
timeout 3
color 0e
set TO_HIDE=
:: now time to remove nasty update
echo Uninstalling KB971033 (WGA)
wusa /uninstall /kb:971033 /quiet /norestart
set TO_HIDE=%TO_HIDE% 971033
echo Uninstalling KB2952664 (Get Windows 10 assistant)
wusa /uninstall /kb:2952664 /quiet /norestart
set TO_HIDE=%TO_HIDE% 2952664
echo Uninstalling KB2976978 (telemetry for Win8/8.1)
wusa /uninstall /kb:2976978 /quiet /norestart
set TO_HIDE=%TO_HIDE% 2976978
echo Uninstalling KB2977759 (telemetry for Win7)
wusa /uninstall /kb:2977759 /quiet /norestart
set TO_HIDE=%TO_HIDE% 2977759
echo Uninstalling KB2990214 (Get Windows 10 for Win7)
wusa /uninstall /kb:2990214 /quiet /norestart
set TO_HIDE=%TO_HIDE% 2990214
echo Uninstalling KB3021917 (installs telemetry for CEIP)
wusa /uninstall /kb:3021917 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3021917
echo Uninstalling KB3022345 (telemetry)
wusa /uninstall /kb:3022345 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3022345
echo Uninstalling KB3035583 (GWX Notification)
wusa /uninstall /kb:3035583 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3035583
echo Uninstalling KB3044374 (Get Windows 10 for Win8.1)
wusa /uninstall /kb:3044374 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3044374
echo Uninstalling KB3068708 (telemetry)
wusa /uninstall /kb:3068708 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3068708
echo Uninstalling KB3075249 (telemetry for Win7/8.1)
wusa /uninstall /kb:3075249 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3075249
echo Uninstalling KB3080149 (telemetry for Win7/8.1)
wusa /uninstall /kb:3080149 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3080149
echo Uninstalling KB3112336 (New Win8.1-^>10 upgrade scenario)
wusa /uninstall /kb:3112336 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3112336
echo Uninstalling KB3112343 (New Win7-^>10 upgrade scenario)
wusa /uninstall /kb:3112343 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3112343
echo Uninstalling KB3123862 (Updated capabilities to upgrade Windows 8.1 and Windows 7)
wusa /uninstall /kb:3123862 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3123862
echo Uninstalling KB3173040 (end of free upgrade offer notification (another spam) for Windows 8.1 and Windows 7)
wusa /uninstall /kb:3173040 /quiet /norestart
set TO_HIDE=%TO_HIDE% 3173040
echo now, let's hide these nasty updates
echo (this WILL take a while)
"%SystemRoot%\System32\WScript.exe" "%temp%\banUpdate.vbs" %TO_HIDE%
timeout 30
:: then taking ownership of remnant folders
echo Take control for all folders GWX
timeout 3
:: let's check if GWX was already removed
set error=0
if not exist %windir%\System32\GWX set error=%error%+1
if not exist %windir%\SysWOW64\GWX set error=%error%+1
if %error%==2 set error1=1
takeown /F %windir%\System32\GWX /A /R /D %yes%
takeown /F %windir%\SysWOW64\GWX /A /R /D %yes%
takeown /F %windir%\System32\Tasks\Microsoft\Windows\Setup /A /R /D %yes%
echo Change rights for all folders GWX
timeout 3
icacls %windir%\System32\GWX /grant "%username%":(F) /T /C
icacls %windir%\SysWOW64\GWX /grant "%username%":(F) /T /C
icacls %windir%\System32\Tasks\Microsoft\Windows\Setup /grant "%username%":(F) /T /C
:: ok, now time to kill executable and remove this shit out of our computer
echo Delete all GWX files and folders
timeout 3
echo Before kill GWX.exe if necessary
taskkill /f /t /im GWX.exe
timeout 3
del /F /S /Q /A %windir%\System32\GWX\*
rd /S /Q %windir%\System32\GWX
:: some error handling (see eof)
if exist %windir%\System32\GWX set error1=2
del /F /S /Q /A %windir%\SysWOW64\GWX\*
rd /S /Q %windir%\SysWOW64\GWX
if exist %windir%\SysWOW64\GWX set error1=2
:: removing related sheduled tasks
del /F /S /Q /A %windir%\System32\Tasks\Microsoft\Windows\Setup\*
rd /S /Q %windir%\System32\Tasks\Microsoft\Windows\Setup\gwx
rd /S /Q %windir%\System32\Tasks\Microsoft\Windows\Setup\GWXTriggers
:: setting policy to disable GWX
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Gwx"
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Gwx" /v DisableGwx /t REG_DWORD /d 1
:: prevent further upgrade
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DisableOSUpgrade /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade"
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade" /v AllowOSUpgrade /t REG_DWORD /d 0
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade" /v ReservationsAllowed /t REG_DWORD /d 0
if error1==1 goto error1
if error1==2 goto error2
color 0a
echo Cleaned. Have a nice day.
pause
exit
:error1
color 0c
echo GWX does not seems to be installed. Tried to clean everything anyway.
pause
exit
:error2
color 0c
echo Cannot remove GWX folder, are you really running this as admin? Tried to clean what I can anyway.
pause
exit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment