文章目录

  • "混乱"的 Windows 10 更新系统代理(下)
    • 扫描阶段代理配置
      • 自动更新
      • 指定更新源
    • DO下载更新代理配置
    • BITS下载更新代理配置
    • 小结
    • 参考

"混乱"的 Windows 10 更新系统代理(下)

《"混乱"的 Windows 10 更新系统代理(上)》介绍了 Windows中代理分类及基本的配置,本文介绍这些代理配置是如何影响 Windows 更新过程的。

Windows 更新过程涉及扫描、下载、安装过程,每一部分都采用独立的服务。Windows 更新客户端利用 Windows HTTP 服务(WinHTTP)扫描检查可用更新;利用 Background Intelligent Transfer Service (BITS)服务或者 Delivery Optimization (DO)服务下载更新。这些服务各自独立,需要针对它们分别进行代理配置,使其能够通过代理完成 Windows 系统更新。再加上不同组策略的影响,当用户为更新系统配置代理的时候,偶尔会出现明明已经开启代理,但更新服务就是没有工作,这不免会产生"混乱"的感觉。

扫描阶段代理配置

Windows 更新过程开始于更新客户端扫描更新服务器以发现适用于本机的更新包信息。

自动更新

在 Windows 采用自动更新的场景下,对于没有独立托管更新服务器的用户,客户端计算机直接连接 Windows Update服务器进行更新。更新服务运行在Local System账户的上下文中,不要求用户交互1。从之前的文章中可知,相比WinINet,WinHttp的实现方案更适合此时场景应用,而且更新扫描阶段的确利用WinHttp实现。所以,自动更新场景下,通过使用netsh命令手动配置系统代理够被自动更新服务检测到。

netsh winhttp set proxy myproxy
netsh winhttp set proxy myproxy:80 "<local>bar"
netsh winhttp set proxy proxy-server="http=myproxy;https=sproxy:88" bypass-list="*.contoso.com"

在《How the Windows Update client determines which proxy server to use to connect to the Windows Update website》1一文中提到,当 Windows 更新服务使用系统代理无法访问代理服务的时候,它会尝试使用用户代理。这一点与我们之前的理解有所出入,当然,从原理上讲,WinHttp在service中是有办法获得当前用户代理设置的。更新服务的dll文件引用情况可以验证这一点:wuaueng.dll是更新服务调用的dll,通过PE工具可以看到该dll会引入WinHttp.dll并调用了其中的WinHttpGetIEProxyConfigForCurrentUser函数和WinHttpGetDefaultProxyConfiguration函数。前者对应获取用户代理,当然不是直接获取,而是可以通过服务模拟(impersonate)当前用户的方式来实现;后者对应获取缺省代理配置,可以得到通过netsh所配置的系统代理信息。

下图是更新服务dll调用获取用户代理和系统代理的截图信息:

指定更新源

组织单位可能会内部部署WSUS更新服务器用于更精细管理更新包的审批应用情况,最终用户将不必通过防火墙获得更新,并允许在部署更新前对其进行测试。客户端计算机需要更改组策略设置来指定WSUS更新服务器地址。

组策略设置位置:“计算机配置” -> “管理模板” -> “Windows 组件” -> “Windows 更新”-> “指定 Intranet Microsoft 更新服务位置” -> “选择 Windows 更新客户端用于检测更新的代理行为”.

与自动更新的设置相比,"指定更新服务位置"中对使用代理做了进一步细分。

默认情况下,仅使用系统代理扫描检测更新。当需要使用用户代理检测更新时,必须将代理行为配置为“当使用系统代理进行检测时,允许将用户代理用作回退”。

DO下载更新代理配置

当扫描检测更新阶段获取到适用于本机的更新信息后,Windows 更新客户端利用BITS服务或者DO服务来下载更新。

更新服务默认采用DO进行更新下载。DO利用WinHttp实现文件下载,同时会将当前登录用户的token信息给到WinHttp,这时候WinHttp就可以使用"用户代理"的配置信息访问网络了。所以,默认情况下,如果有用户登录,DO服务会使用"用户代理"来下载更新;当没有用户登录的时候,这时候如果通过netsh配置了"系统代理",DO将使用系统代理。但官方文档不建议使用netsh配置系统代理的方式,因为采用这种方式在处理代理需要用户认证的情况的时候,WinHttp的限制将导致认证失败2

BITS下载更新代理配置

将组策略中的"传递优化"设置为"旁路",则更新服务选用BITS下载更新。设置路径:“计算机配置” -> “管理模板” -> “Windows 组件” -> “传递优化”-> “下载模式”。

这里可能会给用户造成一点儿困扰:配置用户代理后调用BITS可以下载文件,为什么更新包下不来呢?原因是BITS作为系统中的服务可以为普通用户提供下载服务,比如用户通过PowerShell命令调用BITS服务下载文件,此时BITS接受用户上下文运行,默认使用IE代理设置,即使用"用户代理"。作为更新下载服务的时候,用户代理不再有效,所以更新包无法下载。

这时候可以利用bitsadmin工具来为服务的系统账户设置代理3

bitsadmin /util /setieproxy localsystem MANUAL_PROXY proxy1:4556

小结

组策略中的配置选项,仅影响更新服务扫描检测阶段的行为:

  • 使用 Windows Update 直接进行更新,更新服务可以使用系统代理和用户代理进行检查更新,且更新服务可以使用"Windows 凭据"中记录的代理认证信息进行代理连接时候的认证;
  • 当通过组策略配置Intranet更新服务器的时候,根据选项决定是否仅使用系统代理还是将用户代理作为备选项。

更新服务下载阶段行为:

  • DO仅使用用户代理,支持携带认证信息,但DO无法处理更新包分发服务跳转场景(这点参考文章《哎,这是个 Windows 的Bug》);
  • BITS下载更新不会使用用户代理,默认只能使用系统代理;可以通过bitsadmin单独对BITS进行设置,BITS使用系统代理不支持携带认证信息。

更新服务运行的扫描、下载阶段中,各个服务使用用户代理或者系统代理基本都可以工作。最大的区别在于二者底层实现中WinINet支持"凭据管理"而WinHttp不支持,这就导致了使用系统代理的时候,如果代理服务器要求认证,所有的访问就会失败。
针对BITS和DO在支持需认证的http代理的场景,可以有以下的解决方案:

  1. 在代理服务器端添加 “白名单”,能够放行访问某个域名的请求不验证;
  2. 利用WSUS 提供更新包托管服务的情况下,在内网中部署WSUS,利用WSUS通过代理获取更新后,供内部机器更新使用;

参考

  1. How the Windows Update client determines which proxy server to use to connect to the Windows Update website
  1. Using a proxy with Delivery Optimization
  1. Specifying proxy settings for user accounts and service accounts

“混乱“的 Windows 10 更新系统代理(下)相关推荐

  1. 我们无法更新系统保留的分区_「图」Windows 10更新再遇尴尬:无法执行系统恢复点...

    援引外媒PC Gamer报道,近期在安装Windows 10累积更新之后任何使用系统还原( System Restore )的用户都可能会面临一些问题.如果用户已经启用了系统保护,并且此前已经创建了系 ...

  2. 如何更新微软的html,如何升级微软2018 Windows 10更新四月正式版17134系统?

    微软已经正式发布了2018 Windows 10更新四月版系统,版本号是Build 17134,目前微软提供了多种升级途径,那么,如何升级微软2018 Windows 10更新四月正式版17134系统 ...

  3. 微软2019 Windows 10更新五月版:10个不可错过的新功能

    微软已经开始推送最新的2019 Windows 10更新五月版,在此之前经过了长时间的测试,不过目前仅限高级用户才能接收安装,这需要用户及时安装之前的累积性更新补丁,并且尝试手动检查Windows U ...

  4. ubuntu 16.04(Windows 10双系统+grub引导)无法进入tt1~tt6(NVIDIA驱动安装相关-黑屏,login loop,分辨率)...

    目录 前言回顾 最终解决: 0.关闭x服务 1.禁用nouveau 2.加入 3.更新 4.查找匹配驱动 5.选择推荐版本 6.等待安装后重启,nvidia-smi查看是否安装成功,或者lsmod | ...

  5. linux双系统安装nvidia,ubuntu 16.04(Windows 10双系统+grub引导)无法进入tt1~tt6(NVIDIA驱动安装相关-黑屏,login loop,分辨率)...

    [toc] 前言回顾 Ubuntu 16.04 LTS + Windows 10双系统(notebook) 显卡:GeForce GTX 950M 集显+独显 所有不说环境的教程都是耍流氓啊QWQ, ...

  6. Windows 10 的系统要求

    安装 Windows 10 的基本要求 类型 描述 处理器: 1 GHz 或更快的处理器或 系统单芯片(SoC) RAM: 1 GB(32 位)或 2 GB(64 位) : 硬盘空间: DirectX ...

  7. 戴尔服务器鼠标键盘无响应,Windows 10 更新 KB4074588 后,USB 鼠标、键盘和其他设备无响应...

    本文包含有关 Windows 10 更新(KB4074588)后 USB 设备无法响应的信息. USB 设备无响应 运行 Windows 10 的台式机和笔记本电脑可能会使用最近的 Windows 1 ...

  8. 设置代理_如何防止用户更改Windows 10上的代理设置

    如何在Windows 10上禁用代理设置 在Windows 10上,可以使用组策略编辑器和注册表以至少两种不同的方式禁用通过"设置"应用程序(和" Internet选项& ...

  9. windows7黑屏修复_如何在Windows 10更新后修复黑屏

    windows7黑屏修复 RealVector/Shutterstock.comRealVector / Shutterstock.com Some Windows 10 PCs have been ...

最新文章

  1. ggbiplot-最好看的PCA作图:样品PCA散点+分组椭圆+变量贡献与相关
  2. android qt 对比_QT for android 比较完美解决 全屏问题
  3. pageResponse - 让H5适配移动设备全家(移动端适配)1
  4. CV:传统视觉知识—机器视觉系统的基础知识(机器视觉三要素+典型的工业机器视觉系统五大组件)
  5. 人民日报新媒体中心接入神策数据,媒体阅读体验新升级
  6. PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
  7. java连接数据库代码写在哪里,jdbc连接数据库怎么做的。代码写哪里呀 求大神
  8. 【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵
  9. 会议交流 | IJCKG 2021:Keynotes released!欢迎注册参会
  10. 数据结构之排序算法:并归排序
  11. python读取csv第一列_如何使用标头完整的python导入csv文件,其中第一列为非数字...
  12. windows资源管理器经常出现无响应 window语言栏不见了
  13. C++ and C# 从TLS握手二进制中获取SNI(服务器名称指示)域名
  14. 计算机网络原理自考挂科率,3个“挂科率高”的专业,补考更是难上加难,看你专业上榜了吗...
  15. 这种人生最美的场面吸引着千万男孩女孩的憧憬和向往
  16. HBase的java代码开发(完整源码)
  17. 你不知道的 Canvas 表格交互
  18. Apache Druid历险记
  19. 怎么在sqlyog设置表的外键
  20. spring 自定义消息转换器

热门文章

  1. 数据结构课程设计 校园导游系统 c++
  2. 10个免费的PHP编辑器
  3. json转excel_Excel如何制作这种专业的仪表盘?
  4. 优思学院|六西格玛管理的核心理念是什么?
  5. 求matlab大神的帮助,拜托拜托
  6. 学习:深度学习公开课
  7. [6] Word QA
  8. OpenLayers5在EPSG:4326下以m为单位画圆
  9. 如何使用 SQL INSERT 语句将数据插入到表中
  10. 东软2012实习生招聘