HOWTO: 重置 Windows 更新组件
HOWTO: 重置 Windows 更新组件
这几天一直被 KB3189866 这个更新困扰着,两台设备都是卡在45%不再继续。像以往一样停止 Windows Update 服务去删除“SoftwareDistribution”目录发现有几个文件提示正在被使用无法删除,禁用 WU 服务重启再试无果。看来从 14393 开始 Windows Update 的运行机制发生了比较大的改变,貌似与“更新来自多个位置”有关,这个功能允许该电脑将以前下载的 Windows 更新和应用发送到本地网络上的电脑或 Internet 上的电脑,从而起到加快下载速度的目标。
那么现在该如何正确的重置Windows更新组件呢?!首先要停止与更新相关联的所有服务,不再单单只是 Windows Update,需要停止的服务如下:
- net stop bits
- net stop wuauserv
- net stop appidsvc
- net stop cryptsvc
然后删除更新相关目录和文件:
- Del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr*.dat"
- Del “%systemroot%\SoftwareDistribution”
- Del “%systemroot%\system32\catroot2”
最后重新启动电脑,再次执行更新应该就能解决常见的更新故障,如果依旧有问题可以常识重置 BITS 和 WU 的安全描述符,为此执行如下命令行:
- 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)
也可以常识重新注册相关服务的动态链接库:
regsvr32.exe atl.dll
regsvr32.exe urlmon.dll
regsvr32.exe mshtml.dll
regsvr32.exe shdocvw.dll
regsvr32.exe browseui.dll
regsvr32.exe jscript.dll
regsvr32.exe vbscript.dll
regsvr32.exe scrrun.dll
regsvr32.exe msxml.dll
regsvr32.exe msxml3.dll
regsvr32.exe msxml6.dll
regsvr32.exe actxprxy.dll
regsvr32.exe softpub.dll
regsvr32.exe wintrust.dll
regsvr32.exe dssenh.dll
regsvr32.exe rsaenh.dll
regsvr32.exe gpkcsp.dll
regsvr32.exe sccbase.dll
regsvr32.exe slbcsp.dll
regsvr32.exe cryptdlg.dll
regsvr32.exe oleaut32.dll
regsvr32.exe ole32.dll
regsvr32.exe shell32.dll
regsvr32.exe initpki.dll
regsvr32.exe wuapi.dll
regsvr32.exe wuaueng.dll
regsvr32.exe wuaueng1.dll
regsvr32.exe wucltui.dll
regsvr32.exe wups.dll
regsvr32.exe wups2.dll
regsvr32.exe wuweb.dll
regsvr32.exe qmgr.dll
regsvr32.exe qmgrprxy.dll
regsvr32.exe wucltux.dll
regsvr32.exe muweb.dll
regsvr32.exe wuwebv.dll
不要忘记重置 Winsock 可以解决大部分网络访问异常的问题:
netsh winsock reset
同时微软也为我们提供了故障诊断程序,可以自动诊断并修复问题。
- Windows 10 : http://aka.ms/diag_wu
- Windows 8.1、Windows 8 和 Windows 7 : http://go.microsoft.com/?linkid=9830262
HOWTO: 解决资源管理器有两个 OneDrive
HOWTO: 解决资源管理有两个 OneDrive
上周 gOxiA 一个不小心把两个数据盘给误格了,数据损失近 2TB,整整耗费了1周的时间才将数据恢复,由于是主力机所以系统也只能重新安装,Windows 10 1607版,没想到刚安装完就发现一个问题,OneDrive 初始化设置完毕后在资源管理器中竟然看到两个图标目录,位于桌面下,十分诡异!既然是同名同路径,而且图标显示 OneDrive 的状态和右键功能都正常,说明这两个图标应该是通过注册表加载的标识符。
标识符在系统中是具有唯一性的,否则也不可能出现两个同名图标,搜索 MSDN 了解到在注册表中 CLSID 分支存储着系统中所有 COM 类对象的数据,路径位于 “HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID}”,启动注册表编辑器定位到这个路径开始搜索关键词 OneDrive,看看会有什么收获!如下截图搜索到了很多 OneDrive 相关的标识符,其中有些 CLSID 下包含 ShellFolder 看起来挺有关联。
为了继续验证,启动了 Sysinternals 套件的 Process Monitor 工具对资源管理进行监测,因为重点怀疑的是注册表,并且问题在资源管理器中可以重现,所以进行了过滤,果然收集到了有价值的数据。从截图可以看到当 gOxiA 访问资源管理器的这两个 OneDrive 后,Process Monitor记录下了这两个图标的 CLSID,分别是:
{018D5C66-4533-4307-9B53-224DE2ED1FE6}
{D227B6E2-5C41-4EB2-BD76-51940CFD391F}
既然找到了两个图标的 CLSID 那么就可以在注册表中缩小搜索范围了。继续搜索注册表锁定了问题范围,从下面截图可以看到在下面两个路径下存在 CLSID 记录,从注册表项的名称看确有关联。
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel
下来尝试修改“HideDesktopIcons”-“NewStartPanel” 下相关的 CLSID 值改为为 0,不隐藏图标进行测试。(注意:在进行注册表操作前一定要进行备份!!!)刷新桌面,可以看到出现了两个 OneDrive 图标,OK 问题可以锁定了!但奇怪的是当删除其中一个 OneDrive 的 CLSID 后,桌面仍有两个图标,而且资源管理其中也仍旧显示两个图标。尝试删除“Desktop”-“NameSpace” 下的项进行测试,发现两个图标的问题解决了!
虽然问题得到解决了,但是应该删除哪个 CLSID 呢?如何确定这两个 CLSID 哪个才是当前 OneDrive 所使用的呢?翻出之前 Process Monitor 监测的结果,可以看到 OneDrive 的配置项所在的位置。
HKEY_CURRENT_USER\SOFTWARE\Microsoft\OneDrive
顺藤摸瓜再接再厉,找吧!
功夫不负有心人,HKEY_CURRENT_USER\SOFTWARE\Microsoft\OneDrive\Accounts\Personal,下面“NamespaceRootId”记录的 CLSID 值就是当前所使用的,至此可以收官了!
结束前做了一个小测试,删除了当前正在使用的 CLSID 项,发现从系统栏打开 OneDrive 时会报错。此外还有一个问题!虽然删除了资源管理器和桌面中的图标(注册表对应的项和值),但是监测发现,打开资源管理时还是会去读取已经删除的 CLSID,说明仍有残留,可是注册表中已经搜索不到这个 CLSID,检查 OneDrive 的配置文件仍一无所获,也许是一个 Bug 已经提交微软反馈中心,期待后续会彻底解决。(考虑重新做一遍系统,同步数据这事还是靠谱点好!!!)
HOWTO: 在执行 Sysprep generalize 后保留预部署的硬件驱动
HOWTO: 在执行 Sysprep generalize 后保留预部署的硬件驱动
在 IT 设备部署中我们都会使用 Sysprep 对黄金映像进行初始化,默认情况下执行 Sysprep 后会删除当前系统中的所有设备驱动数据,使其在后续能应用在其他不同的硬件设备上。但是也有一些特例,例如 IT 人员针对一款笔记本设备做了软件的预定义,并测试这些软件在特定的硬件驱动版本上能够正常工作,那么就要确保在对当前实例执行 Sysprep 后,驱动能够被保留下来,同时也通过驱动的预部署加速后续的部署过程。
一些传统的做法肯定是将驱动集成到部署过程中进行实时安装,其实无需那么麻烦!如果是针对性的系统映像,我们完全可以单独维护一份映像。在审核模式下就将所需的设备驱动安装完毕,然后启用 Windows 应答文件中提供的硬件驱动保留选项,实现我们的需求。
为此,添加 Microsoft-Windows-PnpSysprep_neutral 中的 PersistAllDeviceIns 选项,将其设置为 true 即可。需要注意的是,因为该选项处于 generalize 阶段,所以在执行 sysprep 时就要进行加载。
参考文档: https://technet.microsoft.com/zh-cn/library/dd744391(v=ws.10).aspx