转自 http://wangye.org/blog/archives/1035/
去年7月写过一篇文章讲解如何去除扰人的获取Windows 10的图标,那时候微软也只是推送了获取Windows 10的提示,具体安装Windows 10与否还是有显著的选项让用户自己选择的。
虽然通过先前的方法确实抑制了升级Windows 10的提示,怎奈微软接下来连续放大招推送升级补丁,并且不怎么明显的“诱使”用户升级系统,比如我遇到的微软健康助手提示升级,并且默认勾选同意的坑。其实我不是说Windows 10不好,就是较为反感微软的推送方式,就好像你去商场老是有业务员跟着你,不停向你推荐某某产品好等等,而且因为大部分客户电脑上一些业务系统在Windows 10下存在各种兼容问题,就有客户反应因为不小心升级Windows 10导致业务软件不能正常运行最后只有重新安装老系统(其实对于误安装有办法直接恢复到老系统,方法附本文后)。
经常有朋友说我思想老顽固了,不愿意去尝试新鲜事物,其实不是不愿意尝试,而是越来越觉得适合自己的才是最好的,不喜欢繁杂的功能,觉得简单才是一种美,好了言归正传,防止老系统升级到Windows 10实际上已经有人开发了软件GWX Control Panel,大家直接下载后运行,再点击即可防止系统升级,用这个软件还有个好处就是可以在想升级的时候再进行恢复,软件简单操作如下。
1、运行下载的GWX Control Panel程序,首先接受并同意须知,如下图所示:
2、点击“Prevent Automatic Windows 10 Upgrades”即可禁止自动的Windows 10升级,其他的选项也有特定含义,主要的我翻译如下图所示:
其实对于快餐族或者实用主义者来说GWX Control Panel已经足够,所以下面的内容可以忽略,但是我有一颗重复造轮子的心,遂根据我收集的关于禁止升级到Windows 10的相关文献资料,对于禁止升级到Windows 10,大体上分为以下几个步骤:
1、卸载并且隐藏关联更新,这些更新主要包括如下:
通过以下批处理可以完成相关卸载,另存为.bat文件,并右击以管理员身份运行:
@echo on
wusa /uninstall /kb:3035583 /norestart /quiet
wusa /uninstall /kb:3022345 /norestart /quiet
wusa /uninstall /kb:3068708 /norestart /quiet
wusa /uninstall /kb:3075249 /norestart /quiet
wusa /uninstall /kb:3080149 /norestart /quiet
wusa /uninstall /kb:2990214 /norestart /quiet
wusa /uninstall /kb:3012973 /norestart /quiet
wusa /uninstall /kb:2952664 /norestart /quiet
wusa /uninstall /kb:2976978 /norestart /quiet
隐藏相关更新项目,以避免再一次被推送安装,如何隐藏Windows更新,可以通过以下步骤来实现:
(1) 控制面板 – 所有控制面板项 – Windows Update 点击如下图位置(不完全一样,位置相同)找到待更新的项目:
(2) 对更新项目右击,选择“隐藏更新”即可,如下图所示:
2、修改相关注册表
将下面的注册表相关另存为.reg文件,并且双击导入即可完成修改:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade]
"AllowOSUpgrade"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade\State]
"OSUpgradeState"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate]
"DisableOSUpgrade"=dword:00000001
3、删除相关文件
删除%SystemRoot%\System32\GWX
目录及相关文件,通过以下批处理完成:
del /f /s /a /q %SystemRoot%\System32\GWX
删除已经下载的Windows 10安装包及相关文件,通过以下批处理完成:
del /f /s /a /q %SystemDrive%\$Windows.~BT del /f /s /a /q %SystemDrive%\$Windows.~WS
这里解释一下,$WINDOWS.~BT
文件夹内容是Windows10预下载镜像,这个文件夹很大因为包含了一个操作系统嘛;$Windows.~WS
文件夹是下载工具MediaCreationTool下载的文件夹,默认保留原先旧系统31天,其实并不建议大家通过以上批处理完成清理过程,可以通过系统自带的“磁盘清理工具”来清理比较好。
经过这么一折腾,你的Windows 7/8/8.1又将恢复安静了,至于什么时候安装Windows 10则完全由个人决定,而不是每天都有人催促和推销(M$表打我)。当然我希望这个过程能够越快越好和越简单越好,对于业余系统维护人员来说,客户电脑越稳定自己要做的工作越少,花费的时间也越少,所以不希望有客户误点升级导致业务软件失效,所以我将上述功能打包成VBScript可执行脚本,只要在不可以升级的系统上运行即可免去误升级的烦恼,当然脚本由于个人能力有限可能存在潜在的Bug,因此带来的问题与本人无关,建议使用前备份相关文件。
'
' File Description : Disable Windows 7/8/8.1 Upgrade to Windows 10
'
' Copyright (c) 2016 WangYe. All rights reserved.
'
' Author: WangYe
' Site: http://wangye.org
' This code is distributed under the BSD license
'
' Usage:
' CScript path/to/this/script
'
' *** 请不要移除此版权信息 ***
'
Option Explicit
Class WinUpdateMgr
Private objSession
Private objCollection
Private Sub Class_Initialize()
Set objSession = WScript.CreateObject("Microsoft.Update.Session")
objSession.ClientApplicationID = "Disable Windows 10 Update Script"
Set objCollection = WScript.CreateObject("Microsoft.Update.UpdateColl")
End Sub
Private Sub Class_Terminate()
Set objCollection = Nothing
Set objSession = Nothing
End Sub
Public Sub AddToCollection(ByRef objUpdateItem)
objCollection.Add objUpdateItem
End Sub
Public Sub ClearCollection()
objCollection.Clear
End Sub
Public Function GetCollectionCount()
GetCollectionCount = objCollection.Count
End Function
Public Function Install()
If objCollection.Count > 0 Then
Dim objInstaller
Set objInstaller = objSession.CreateUpdateInstaller()
objInstaller.Updates = objCollection
Set Install = objInstaller.Install()
ClearCollection
Set objInstaller = Nothing
End If
End Function
Public Function Uninstall()
If objCollection.Count > 0 Then
Dim objInstaller
Set objInstaller = objSession.CreateUpdateInstaller()
objInstaller.Updates = objCollection
Set Uninstall = objInstaller.Uninstall()
ClearCollection
Set objInstaller = Nothing
End If
End Function
Public Function EnumUpdates(ByVal strCallback, ByVal strQuery, ByRef Param)
Dim i
Dim objSearcher, objSearchResult, objUpdateItem
Dim fnCallback
Set fnCallback = GetRef(strCallback)
Set objSearcher = objSession.CreateUpdateSearcher()
Set objSearchResult = objSearcher.Search(strQuery)
For i = 0 To objSearchResult.Updates.Count - 1
Set objUpdateItem = objSearchResult.Updates.Item(i)
if fnCallback(objUpdateItem, Me, Param) Then Exit For
Set objUpdateItem = Nothing
Next
Set objSearcher = Nothing
Set objSearchResult = Nothing
Set fnCallback = Nothing
EnumUpdates = i
End Function
End Class
' KB2990967 and KB3035583
Function RemoveUpdateCallback(ByRef objItem, ByRef objThis, ByRef Param)
Dim i, kbArticleId
For i = 0 To objItem.KBArticleIDs.Count - 1
kbArticleId = objItem.KBArticleIDs(i)
If InStr("," & Param & ",", "," & kbArticleId & ",") Then
WSH.StdOut.Write "Found " & objItem.Title & " ... "
If objItem.IsInstalled Then
WSH.StdOut.Write "Installed"
WSH.StdOut.Write vbCrLf
objThis.AddToCollection objItem
Else
WSH.StdOut.Write "Not Installed"
WSH.StdOut.Write vbCrLf
End If
WSH.StdOut.Write " * Hiding this update now ... "
objItem.IsHidden = True
WSH.StdOut.Write " Completed" & vbCrLf
End If
Next
End Function
Sub RemoveWinUpdates()
Dim objWUMgr, objUninstallResult
Set objWUMgr = New WinUpdateMgr
WSH.Echo "Please wait for checking Windows updates ..."
objWUMgr.EnumUpdates "RemoveUpdateCallback", "Type='Software'", _
"3035583,2952664,3022345,3021917,3068708,3075249,3080149,2990214,3012973,2976978"
WSH.Echo "---------- Check Completed -----------"
If objWUMgr.GetCollectionCount() > 0 Then
WSH.Echo "Please wait for uninstall Windows updates ..."
Set objUninstallResult = objWUMgr.Uninstall()
WSH.Echo "Uninstall completed (ResultCode = " & objUninstallResult.ResultCode & ")"
If objUninstallResult.RebootRequired > 0 Then
WSH.Echo "You need restart computer for complete uninstall steps"
End If
Set objUninstallResult = Nothing
End If
WSH.Echo
Set objWUMgr = Nothing
End Sub
Sub UpdateRegistry()
Const HKLM = &H80000002
Dim strComputer, objRegistry, strKeyPath
WSH.Echo "Update registry now ..."
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & _
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade"
objRegistry.CreateKey HKLM, strKeyPath
objRegistry.SetDWORDValue HKLM, strKeyPath, "AllowOSUpgrade", 0
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\OSUpgrade\State"
objRegistry.CreateKey HKLM, strKeyPath
objRegistry.SetDWORDValue HKLM, strKeyPath, "OSUpgradeState", 1
strKeyPath = "SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"
objRegistry.CreateKey HKLM, strKeyPath
objRegistry.SetDWORDValue HKLM, strKeyPath, "DisableOSUpgrade", 1
strKeyPath = "SOFTWARE\Policies\Microsoft\Windows\Gwx"
objRegistry.CreateKey HKLM, strKeyPath
objRegistry.SetDWORDValue HKLM, strKeyPath, "DisableGwx", 1
WSH.Echo "--------- Update Completed -----------"
WSH.Echo
Set objRegistry = Nothing
End Sub
Sub DeleteAll(ByRef fso, ByVal strFileName)
Const DeleteReadonly = True
Dim objFile, objFolder, objSubFolder
If fso.FileExists(strFileName) Then
fso.DeleteFile strFileName, True
Exit Sub
End If
If fso.FolderExists(strFileName) Then
Set objFolder = fso.GetFolder(strFileName)
fso.DeleteFile(fso.BuildPath(objFolder.Path, "*")), DeleteReadonly
fso.DeleteFolder(fso.BuildPath(objFolder.Path, "*")),DeleteReadonly
For Each objFile In objFolder.Files
On Error Resume Next
objFile.Delete True
On Error GoTo 0
Next
For Each objSubFolder In objFolder.SubFolders
On Error Resume Next
objSubFolder.Delete True
On Error GoTo 0
Next
objFolder.Delete True
Set objFolder = Nothing
End If
End Sub
Sub DeleteFiles()
Const WindowsFolder = 0
Const SystemFolder = 1
WSH.Echo "Please wait for Clean up unwanted folders or files ..."
WSH.Echo "--------------------------------------"
Dim objFileSysObj, objFile, strRootDir, strFileName
Set objFileSysObj = WScript.CreateObject("Scripting.FileSystemObject")
WSH.Echo "Clean up GWX folder ..."
Set objFile = objFileSysObj.GetSpecialFolder(SystemFolder)
strFileName = objFileSysObj.BuildPath(objFile.Path, "GWX")
DeleteAll objFileSysObj, strFileName
Set objFile = Nothing
WSH.Echo "Clean up Downloaded Windows 10 folder ..."
Set objFile = objFileSysObj.GetSpecialFolder(WindowsFolder)
strRootDir = objFileSysObj.GetParentFolderName(objFile.Path)
strFileName = objFileSysObj.BuildPath(strRootDir, "$Windows.~BT")
DeleteAll objFileSysObj, strFileName
strFileName = objFileSysObj.BuildPath(strRootDir, "$Windows.~WS")
DeleteAll objFileSysObj, strFileName
Set objFile = Nothing
WSH.Echo "--------- Clean up Completed ---------"
WSH.Echo
Set objFileSysObj = Nothing
End Sub
Sub TerminateProcess(ByVal strProcName)
Const strComputer = "."
Dim objWMIService, colProcessList, objProcess
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & strProcName & "'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
End Sub
Sub KillProcesses()
WSH.Echo "Terminate process now ..."
WSH.Echo "Kill GWX in process list ..."
TerminateProcess "GWX.exe"
TerminateProcess "GWXUX.exe"
TerminateProcess "Gwxgc.exe"
TerminateProcess "Gwxconfigmanager.exe"
TerminateProcess "Gwxdetector.exe"
TerminateProcess "Gwxuxworker.exe"
WSH.Echo "-------- Terminate Completed ---------"
WSH.Echo
End Sub
Function CurrentUserIsAdmin()
Dim objNetwork, strComputer, strUser, objUser, objGroup
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strUser = objNetwork.UserName
CurrentUserIsAdmin = False
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser in objGroup.Members
If objUser.Name = strUser Then
CurrentUserIsAdmin = True
Exit Function
End If
Next
End Function
' http://stackoverflow.com/questions/4765485/how-to-force-vbs-script-to-run-in-cscript-host
' http://stackoverflow.com/questions/4692542/force-a-vbs-to-run-using-cscript-instead-of-wscript
Sub ForceCScriptExecution(ByVal runAsAdmin)
On Error Resume Next
WScript.StdErr.Write(Chr(7))
If Err.Number <> 0 Then
Err.Clear
On Error GoTo 0
Dim WshShell, sh, Arg, Str
Set WshShell = WScript.CreateObject("WScript.Shell")
sh = WshShell.ExpandEnvironmentStrings("%SystemRoot%\System32\CScript.exe")
If InStr(sh,"%") = 1 Then sh="CScript.exe"
For Each Arg In WScript.Arguments
If InStr( Arg, " " ) Then Arg = """" & Arg & """"
Str = Str & " " & Arg
Next
If runAsAdmin Then
Wscript.CreateObject("Shell.Application").ShellExecute _
sh, "//NoLogo """ & _
WScript.ScriptFullName & """ " & Str, "", "runas", 1
Else
WshShell.Run sh & " //NoLogo """ & _
WScript.ScriptFullName & """ " & Str
End If
WScript.Quit()
End If
End Sub
Function GetWindowsVersion()
Dim strComputer, objWMIService
Dim colOperatingSystem, objOperatingSystem
strComputer = "."
Set objWMIService = GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colOperatingSystem = _
objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
Dim Version
For Each objOperatingSystem in colOperatingSystem
Version = objOperatingSystem.Version
Next
GetWindowsVersion = Version
End Function
Sub Pause(strPause)
WScript.Echo (strPause)
WScript.StdIn.Read(1)
End Sub
Function VBMain()
VBMain = 0
Dim strVersion, arrVersion
strVersion = GetWindowsVersion()
arrVersion = Split(strVersion, ".")
' https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724832(v=vs.85).aspx
If CInt(arrVersion(0)) <> 6 Or _
(CInt(arrVersion(0)) = 6 And _
( CInt(arrVersion(1)) <> 1 And _
CInt(arrVersion(1)) <> 2 And _
CInt(arrVersion(1)) <> 3 )) Then
MsgBox "This Script Must Run under Windows 7/8/8.1"
VBMain = 1
Exit Function
End If
ForceCScriptExecution True
WSH.Echo "Disable Windows 10 Upgrade Tool 1.0" & vbCrLf &_
"Written By WangYe http://wangye.org/" & vbCrLf & vbCrLf
If Not CurrentUserIsAdmin() Then
WSH.Echo "**** Error: This Script Must Run under Administrators Account ****"
Pause "Press any key to exit..."
VBMain = 1
Exit Function
End If
KillProcesses
RemoveWinUpdates
UpdateRegistry
DeleteFiles
End Function
WSH.Quit(VBMain())
另存为*.vbs
文件,直接双击即可(如果安全软件提示直接选择允许),这一段脚本其实还有一些小问题,比如隐藏更新的功能貌似一直无效,所以隐藏更新还需要手动操作,另外检查Windows更新时候等待的时间非常之长,需要有足够的耐心,所以总体上这段代码还是供大家参考吧。
如果已经不小心升级,在30天内还可以通过以下方式进行补救,点击左下角开始标识(田字标志),点击“设置”,如下图所示:
点击“更新和安全”选项,如下图所示:
选择“恢复”并在右边找到“回退到Windows 7”,点击“开始”即可完成回滚过程,如下图所示:
参考文档
文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型
文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.
文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件
文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述
文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计
文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console
文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标
文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*
文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非
文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java
文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上
文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成