ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Server 2016 装 .NET 3.5 报 0x800F081F 离线排查

Server 2016 装 .NET 3.5 报 0x800F081F 离线排查 Windows Server 2016 上要跑一套老业务系统前置条件里写着需要 .NET Framework 3.5于是打开服务器管理器勾上角色和功能一路下一步结果进度条走到一半弹出一条红字安装一个或多个角色、角色服务或功能失败错误代码 0x800F081F。去网上搜答案五花八门有人说挂 ISO 用 DISM有人说改组策略有人说装个 dotnetfx35.exe 就行——照着试一圈问题还在。这个场景我做运维这些年遇到过不下几十次Server 2016、2019、2022 甚至客户端 Windows 10/11 上的处理思路是一脉相承的。这篇就把 .NET 3.5 在 Server 2016 上装不上的来龙去脉、离线安装的完整操作、内网更新点环境的绕行方案以及我自己在排查链路上总结的顺序一次性讲清楚。适合正在被这台老组件卡住的中初级运维、刚接手服务器的新人也适合想搞明白按需功能到底是怎么一回事的技术爱好者。1. Server 2016 上装 .NET 3.5 为什么不像装个补丁那么简单1.1 从系统自带组件到按需功能的转变很多人的困惑点在于明明 Server 2008 R2 时代勾一下就好了怎么到了 2016 就变得这么麻烦。这个变化发生在 Windows 8 和 Windows Server 2012 这个时间点微软把 .NET Framework 3.5 从随系统镜像一起落盘的内置组件改成了Features on Demand按需功能。按需功能的含义是系统里只保留这个组件的占位描述也就是 CBSComponent Based Servicing基于组件的服务数据库里的一条记录告诉你有这么个东西、它由哪些子功能组成、依赖什么真正的二进制载荷也就是那些 cab 包并不随系统盘一起装到本地。当你勾选、启用它的时候系统才会去一个源那里把载荷取回来交给 CBS 去做实际的落盘和注册。微软这么改有两个很现实的考量。一是体积.NET 3.5 全套载荷加上各种语言包几百 MB 打底对于云主机镜像、批量部署的操作系统模板来说这是白白浪费的空间而绝大多数新应用早就跑在 4.x 上了。二是维护成本把可选组件从主镜像里剥离出去主镜像的更新和安全补丁链路会清爽很多。理解了这一点很多现象就顺理成章了为什么断网的服务器一定装不上、为什么指向一个路径不对的目录会报找不到源文件、为什么同样的命令在这台机器上能用在那台上不能用。因为你的操作本质上不是安装一个软件而是让 CBS 从一个源里取回一个已登记的组件载荷——源有问题一切免谈。注意.NET 3.5 和 .NET 4.x 是两条完全独立的运行时装 4.8 不会顺带把 3.5 带上反过来也一样。老应用报需要 3.5指的是 v2.0 CLR 那一套运行时.NET 3.5 内部仍然使用 CLR 2.0 引擎和 4.x 的 CLR 4.0 互不替代。1.2 三个高频错误码分别指向什么在动手之前先看懂错误码比急着敲命令重要得多。.NET 3.5 安装失败常见的错误码就那么几个但它们背后的病因完全不是一回事用错药只会浪费半天时间。0x800F081F找不到源文件。这是出现频率最高的一条。典型场景是服务器没有外网系统按默认逻辑试图去取载荷却取不到或者你指定了/Source路径但那个路径里没有对应的 cab 包又或者是介质版本、语言和当前系统对不上。它表达的是我要的东西在指定的地方没找到。0x800F0906无法下载源文件。系统能确定该去哪拿但在拿这个动作上失败了——更新服务没起来、网络出口不通、DNS 解析异常、某些安全软件拦了出站请求。它和 081F 的区别在于一个是没找到地方一个是找了但拿不回来。0x800F0907被策略挡住。服务器的更新行为被组策略或注册表约束成只能从某个内部更新点获取或者从不检查更新系统根本不允许主动去外部取载荷。0x800F0954这个码在内网机器上特别常见。系统试图直接访问外部更新源但被内部统一更新点的策略拦截于是返回失败。它的潜台词是策略不允许我绕过内部更新点可内部更新点里又没有这个载荷。0x800F0922相对模糊的一条系统盘空间不足、BITS 服务异常、组件存储有轻微损坏都可能触发。记住这个判断逻辑先看错误码分大类再往对应的方向查比盲目试方案效率高得多。我见过有人在 0x800F0954 的情况下反复重挂 ISO其实策略根本没放开挂一百次也没用。1.3 动手前的两项确认装没装、系统是什么版本正式动手前一定要做两件事这两件事加起来不超过三分钟但能省掉后面大量的无效操作。第一确认目标功能是不是真的没启用。有些老软件的检测逻辑很粗暴它可能只是判断注册表某个键不存在就报缺少 .NET 3.5。用下面任意一条命令确认实际状态# DISM 方式 dism /online /get-featureinfo /featurename:NetFx3# PowerShell 方式Server 专用模块 Get-WindowsFeature NET-Framework-Core也可以直接查注册表reg query HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 /v Install返回Install REG_DWORD 0x1就说明运行时本体已经在了。如果确认已经在那问题就不在安装环节得往应用自身的配置上找。第二确认系统的准确版本号。Server 2016 对应的内核版本是10.0.14393这个数字非常关键因为 sxs 载荷的来源介质必须和它对齐。用winver或者下面这条命令看一眼[System.Environment]::OSVersion.Version别小看这一步。我遇到过一次运维同事从文件服务器上随手拿了一个 Server 2019 的 ISO对着 14393 的系统指 sxs 路径报的就是 0x800F081F。跨版本的内核组件编号对不上CBS 的适用性检查直接不通过报错信息还特别含糊很容易误导人往路径写错的方向查。2. 离线安装全流程从安装介质里取 sxs 载荷2.1 挑一份能用的安装介质离线安装的核心思路就一句话把安装介质里sources\sxs这个目录当作载荷源指给 DISM 或 PowerShell。所以第一步是准备一份靠谱的介质。选择标准按重要性排序版本必须匹配也就是 Server 2016内核 14393。评估版Eval镜像在文件层面和正式版是同一套组件通常也能用但生产环境我还是建议用和系统一致的正式介质少一层不确定性。语言尽量匹配。中文系统的服务器优先用中文介质。语言的匹配度会影响某些语言相关子功能的载荷虽然多数情况下 NetFx3 的主包能跨语言装但一旦涉及子功能就会出问题不如一开始就对齐。必须是完整镜像。这一点我放在 5.1 里单独展开是踩过坑的。介质到手后在服务器上挂载它虚拟光驱或者直接右键装载 ISO记下分配的盘符假设是E:。2.2 挂载、校验、落地到本地磁盘挂载之后别急着敲安装命令先做一次校验——看看源里到底有没有你要的东西。# 列出 sxs 目录里和 netfx3 相关的载荷文件 Get-ChildItem E:\sources\sxs -Filter *.cab | Where-Object { $_.Name -like *netfx3* } | Select-Object Name, Length正常情况下你应该能看到类似microsoft-windows-netfx3-ondemand-package.cab这样的文件名加上若干带语言标记的包。如果这条命令什么都没输出先别往下走问题出在介质本身换一份再来。确认有载荷之后强烈建议把整个 sxs 目录复制到本地磁盘而不是直接用 ISO 里的路径# 复制到本地路径随意别带空格和中文 Copy-Item E:\sources\sxs -Destination C:\sxs -Recurse为什么要多这一步三个原因。第一ISO 的挂载是临时的服务器一重启挂载点就没了如果安装过程因为某些原因中断需要重试你会发现源不见了报错又变成 0x800F081F很容易被带偏。第二挂载分配的盘符不是固定的虚拟机里多挂几个盘就可能漂移。第三从本地磁盘读取的稳定性明显更好组件安装过程涉及大量小块文件的读取从物理磁盘读比从虚拟光驱读更可控。复制完成后确认一下目标目录里的文件数量对不对(Get-ChildItem C:\sxs -Filter *.cab).Count正常的完整 sxs 目录里 cab 文件是成百上千个的如果只有个位数说明源介质本身就有问题。2.3 DISM 与 PowerShell 两条命令路径怎么选源准备好之后安装命令其实就一条但 DISM 和 PowerShell 两种写法各有适用场景。DISM 写法最通用Server Core 和带 GUI 的版本都能跑dism /online /enable-feature /featurename:NetFx3 /all /source:C:\sxs /limitaccess /norestart参数逐个解释一下这几个参数每一个都有它的作用少一个都可能出问题参数作用为什么必须加/online针对当前运行的系统操作不加会去操作离线映像方向就错了/enable-feature启用功能与/disable-feature相对/featurename:NetFx3指定 .NET 3.5 的功能名名称必须准确写错直接报不支持/all连同所有父功能和子功能一起启用不加的话 WCF、HTTP Activation 这些子功能不会装很多老应用恰恰依赖它们/source:C:\sxs指定载荷来源目录关键参数指向的是目录本身不是里面的 cab 文件/limitaccess禁止联系外部更新源最关键的一个不加它 DISM 可能仍会尝试联网内网机器就会卡很久然后失败/norestart安装完不自动重启生产环境控制重启时机建议加上PowerShell 写法Server 2016 上更顺手能拿到结构化输出Install-WindowsFeature -Name NET-Framework-Features -Source C:\sxs -IncludeAllSubFeature或者用 DISM 模块的 cmdletEnable-WindowsOptionalFeature -Online -FeatureName NetFx3 -All -Source C:\sxs -LimitAccess -NoRestart两条 PowerShell 路径的差别Install-WindowsFeature来自 ServerManager 模块是服务器角色的管理入口它的-IncludeAllSubFeature对应 DISM 的/allEnable-WindowsOptionalFeature来自 Dism 模块更贴近底层的可选功能语义。功能上都够用我个人的习惯是服务器角色相关的统一用Install-WindowsFeature因为输出格式和服务器管理器里的显示是一致的排查时对得上。跑完之后正常情况下会看到进度提示然后返回成功。如果返回的是The operation completed successfully或者 PowerShell 里的Success: True说明 CBS 已经接受了这个安装请求。2.4 装完怎么验证才算真的成功命令返回成功不等于万事大吉CBS 的安装是异步推进的而且有待重启状态。验证分三步走。第一步看功能状态Get-WindowsFeature NET-Framework-*输出里NET-Framework-Core、NET-Framework-45-Core、NET-Framework-Features这些条目的Install State都应该是Installed。注意 Core 和 Features 是两个层级Core 是运行时本体Features 是包含子功能的合集。第二步看子功能有没有跟上dism /online /get-featureinfo /featurename:NetFx3输出里的State : Enabled是基本要求下面还会列出父功能和各子功能的启用状态。如果子功能里有Disabled说明/all没生效或者载荷不全需要补装。第三步回归注册表reg query HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 /v Install返回0x1就实锤了。三步都通过之后重启一次服务器。这一步不是可选的CBS 有些注册和文件替换操作在待重启状态下不会完全提交不重启的话某些老应用仍然会报找不到运行时。重启后再跑一遍第一步的验证状态稳定在 Installed这个环节才算真正收尾。到这里离线安装的主线就走完了。如果一切顺利这大概是十分钟的工作量。真正耗时间的是失败之后的排查那才是这篇文章的重点部分。3. 联网机器与内网机器的两条岔路3.1 允许直连更新源时需要满足什么如果你的服务器能正常访问外部更新源其实不用折腾 ISO 和 sxs直接在服务器管理器里勾选 .NET Framework 3.5 让它自己去取就行。但能联网和更新链路是通的是两件不同的事我见过太多能 ping 通但装不上的案例。按这个顺序检查Windows Update 服务状态。wuauserv必须能正常启动。有些做过优化的镜像或者被第三方工具处理过的系统这个服务被设成了禁用重启后也不会自己起来。BITS 服务状态。后台智能传输服务负责实际的数据下载被禁用的话下载动作根本发起不了。这两条可以一起看Get-Service wuauserv, BITS | Select-Object Name, Status, StartType服务启动类型。光看状态是 Running 不够还要确认StartType是Automatic或Manual如果显示Disabled先改回来Set-Service -Name wuauserv -StartupType Manual Set-Service -Name BITS -StartupType Manual网络出口配置。如果内网是统一出口上网系统层面的 HTTP 出口设置要确认一下netsh winhttp show proxy如果这里配置了出口而实际环境里并不需要或者配置的地址已经失效下载同样会失败。需要清掉的话用netsh winhttp reset proxy。DNS 解析与时间同步。听起来很基础但系统时间偏差过大导致的证书校验失败报出来的错误码也常常是下载类错误方向很容易带偏。安全软件的拦截。某些终端防护产品会对组件安装过程中的临时文件写入做拦截表现就是安装走到一半失败。这个只能通过临时观察或者查软件日志来确认。3.2 组策略里指定可选组件安装和组件修复的设置怎么配这个策略项是所有 .NET 3.5 安装问题的关键开关路径在计算机配置 → 策略 → 管理模板 → 系统 → 指定可选组件安装和组件修复的设置英文环境下叫Specify settings for optional component installation and component repair。它的三种状态对应三种完全不同的行为策略状态系统行为适用场景未配置默认允许直接从外部更新源获取载荷能上网的单机装了就能成功已启用 勾选联系 Windows 更新以直接下载修复内容允许直连更新源获取同时保留内部更新点回退能上网但也有内部更新点的环境已启用 不勾选只允许从内部统一更新点获取禁止直连严格隔离的内网看清楚这张表前面那些错误码就都能对上了。0x800F0907 基本就是策略被设成了只走内部更新点但内部更新点里没有这个载荷0x800F0954 则是策略把直连请求给拦了。修改策略之后一定要让策略立即生效gpupdate /force然后确认实际生效的值别只改了本地组策略却发现域策略优先覆盖了gpresult /h C:\gpo-report.html生成的报告用浏览器打开能清楚看到最终生效的是哪条策略、来自哪个层级。域环境下这一条特别重要本地改了半天被域策略覆盖是常有的事。提示改策略属于环境级变更动手前先把原值记下来截图或者导出报告都行。装完 .NET 3.5 之后把策略改回去避免影响后续其他组件的安装行为。3.3 内网统一更新点环境下的 0x800F0954 绕行域内的服务器十有八九套了统一的更新策略所有更新行为都指向内部的更新服务器。这种环境下安装 .NET 3.5最省事的做法根本不是去和政策较劲而是直接用本地 sxs 源配合/LimitAccess完全绕过更新链路。回到第 2 章的那条命令dism /online /enable-feature /featurename:NetFx3 /all /source:C:\sxs /limitaccess /norestart/limitaccess的作用就在这里体现——它明确告诉 DISM不要尝试联系任何更新源就用我给你的这个目录。这样无论内网策略怎么配都不会触发下载动作也就不会撞上 0x800F0954。如果出于各种原因必须走内部更新点这条路那要检查的是内部更新服务本身有没有同步对应的产品分类和更新类型。这部分需要管理更新服务器的人配合不是单机能解决的。我的建议是为了装一个 NetFx3 去改整条更新链路的配置风险和收益完全不成比例本地源方案又稳又快没有理由不用。顺带说一句同一套逻辑在客户端 Windows 10/11 上也成立只是功能名和命令入口略有差别客户端用的是dism /online /enable-feature /featurename:NetFx3或者Enable-WindowsOptionalFeature源同样指向对应版本镜像的 sxs 目录。思路是打通的。4. 装不上时的排查链路从错误码到 CBS 日志4.1 一张错误码对照表先把范围缩小排查这件事最怕的是没有章法地乱试。我一般会先把错误码对着表看一遍把可能性从十几个收敛到两三个再去逐个验证。下面这张表是我自己整理并一直在用的实测覆盖了绝大多数场景。错误码字面含义最可能的根因优先动作0x800F081F找不到源文件路径写错、介质版本/语言不匹配、sxs 目录被精简、未加 /LimitAccess核对路径内容与介质版本0x800F0906无法下载源文件更新服务异常、网络出口不通、DNS 或时间偏差查服务状态与出口配置0x800F0907被策略阻止策略设为只从内部更新点获取或从不检查更新查组策略生效报告0x800F0954内部更新点拦截统一的更新策略阻止了直连请求改用本地源加 /LimitAccess0x800F0922一般性失败系统盘空间不足、BITS 异常查磁盘剩余空间与服务0x80073712组件存储损坏WinSxS 组件库有损坏先做组件存储修复最后一条要单独说一下因为处理方式和前面几条完全不同。如果怀疑组件存储本身有问题需要先用同版本介质做一次修复dism /online /cleanup-image /restorehealth /source:C:\sxs /limitaccess注意这里的/source指向的是包含组件修复载荷的目录用的是同样的介质只是命令动作变成了修复而不是启用功能。修复完成后再回头装 NetFx3。顺序错了的话安装过程会在一个已经损坏的组件库上做操作报什么错都可能有。4.2 CBS.log 和 DISM.log 里真正该看的那几行错误码给的是方向真正的原因往往藏在日志里。组件安装的主日志在C:\Windows\Logs\CBS\CBS.logDISM 自己的日志在C:\Windows\Logs\DISM\dism.log。CBS.log 可能非常大几百 MB 是常事直接打开会卡死编辑器。用 Select-String 精准过滤Select-String -Path C:\Windows\Logs\CBS\CBS.log -Pattern NetFx3 | Select-Object -Last 60 | ForEach-Object { $_.Line }我关注的关键词有这么几类Failed to find payload或者CBS_E_SOURCE_MISSING源里确实没有对应的载荷文件回到 2.2 重新检查 sxs 目录内容。Not applicable或者适用性检查相关的行版本或语言不匹配换介质。Failed to download或下载相关的行网络链路问题对照 3.1 检查。Blocked by policy或策略相关的行策略拦截对照 3.2、3.3 处理。ERROR_SXS_...开头的组件库层面的问题考虑上面的组件存储修复。DISM.log 里则主要看命令行参数是怎么被解析的有时候问题就出在参数写错比如/source指向了 cab 文件而不是目录或者路径里的空格没处理好。日志里会明确记下解析到的源路径是什么对不上就是参数问题。经验如果 CBS.log 太大不方便处理可以先复制一份出来再筛选避免在实时写入的日志上做长时间读取影响正在进行的安装操作。4.3 服务状态与残留策略这两个隐形杀手有两类问题不会体现在错误码里但会让你反复装不上我把它们叫隐形杀手。第一类是服务被改成禁用。除了前面提到的wuauserv和BITS还有一个容易被忽略的是Windows Modules InstallerTrustedInstaller它是 CBS 的执行主体。这个服务如果起不来安装动作根本推进不了Get-Service TrustedInstaller, wuauserv, BITS, CryptSvc | Select-Object Name, Status, StartType四个服务的StartType都不应该是Disabled。CryptSvc加密服务也列进来是因为组件包的签名校验依赖它Quad。有第三方优化工具会一次性把这几个服务全关掉恢复的时候记得一起恢复。第二类是残留的策略或注册表项。有些时候组策略已经改回去了但注册表里还留着历史配置。检查这两个位置HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU如果里面的配置和当前实际环境不符比如指向了一台已经不存在的更新服务器就是典型的残留。清理前记得先导出备份reg export HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate C:\wu-backup.reg另外还有一个位置值得看一眼就是第 3.2 节讲的那个策略在注册表里的落点通常在HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate下的相关值里。用组策略界面改是最稳妥的方式直接改注册表容易漏掉关联项。排查到这里99% 的场景都能定位到了。剩下的 1% 通常是环境本身的特殊性问题比如某些定制化的安全加固基线对系统目录写入做了额外限制那就需要结合具体环境看了。5. 几个反复踩过的坑和收尾动作5.1 精简镜像的 sxs 目录可能是空的这个坑我踩过两次而且两次都卡了很久因为报错信息指向的方向是错的。现象是这样的从内部文件服务器上拿了一份部署专用镜像挂载后用命令装 NetFx3报 0x800F081F。第一反应是路径写错了反复检查路径、盘符、权限都没问题。后来才想起来看一眼 sxs 目录里到底有没有东西$sxs E:\sources\sxs Get-ChildItem $sxs -ErrorAction SilentlyContinue | Measure-Object | Select-Object Count Get-ChildItem $sxs -Filter *.cab -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum | Select-Object Count, {nTotalMB;e{[math]::Round($_.Sum/1MB,1)}}完整的 sxs 目录cab 文件数量是四位数的总大小在几百 MB。如果返回的 Count 是个位数甚至 0或者目录根本不存在那就是镜像被人为精简过了——为了保证镜像体积sources\sxs被整个删掉了。这种情况下的判断依据很明确目录大小和文件数量。养成一个习惯挂载介质后的第一件事就是确认 sxs 目录的存在性和体积比后面调试半天要高效得多。顺带说这也是为什么我建议在公司内部维护一份完整版介质的副本哪怕平时用的是精简镜像。遇到需要安装按需功能的场景直接取完整版就行不用再去外部找。5.2 网络路径、盘符漂移与访问上下文技术上/Source参数是可以接受 UNC 网络路径的比如\\fileserver\share\sxs。但我不推荐在生产环境这么干原因在于访问上下文。组件安装的实际执行者是 TrustedInstaller 这个系统上下文它访问网络共享用的是机器账户或者系统账户的身份而不是你当前登录的管理员身份。这带来两个后果一是权限可能不够共享和 NTFS 权限如果只给了你的用户账户机器账户就被拒二是即使权限配好了跨网络的读取在组件安装这种高频率小文件读取的场景下稳定性和速度都不理想偶尔会出现读取超时导致安装中断。如果非要用网络路径把共享权限同时授予目标服务器的机器账户并且确认网络链路稳定。但更省事的做法还是复制到本地磁盘几百 MB 的文件局域网拷贝也就几十秒的事。盘符漂移是另一个坑。虚拟机环境里如果 ISO 是通过虚拟光驱挂载的重启之后挂载可能失效或者盘符变成了别的字母。所以我在 2.2 里强调把 sxs 复制到本地磁盘并且用固定路径就是为了规避这一类问题。路径里也尽量别带空格和中文虽然大多数情况下能处理但偶尔会在参数解析上出幺蛾子没必要给自己找麻烦。5.3 组件装上了但业务系统仍然报错的情况最后这一部分是我觉得最有价值的经验——装完 .NET 3.5 之后业务还是起不来这种情况发生的频率比想象中高。先排查最简单的重启了吗CBS 在待重启状态下有些文件操作没有完全提交老应用加载运行时时会失败。重启一次再看。如果重启后还不行往下看几个方向一是子功能没装全。/all参数虽然会带上子功能但如果源里的载荷不全比如用了不完整的介质部分子功能会静默跳过。用dism /online /get-featureinfo /featurename:NetFx3看下面列出的子功能状态重点看 WCF 相关的几个WCF-HTTP-Activation、WCF-NonHTTP-Activation、WCF-HTTP-Activation45之类。很多老应用尤其是服务端程序依赖 WCF 的 HTTP 激活缺了它表现就是运行时找不到。二是 IIS 场景下的配套功能。如果老应用部署在 IIS 上跑 ASP.NET 2.0 应用池光装 .NET 3.5 本体不够还要在 Web 服务器角色的应用程序开发分类下勾选ASP.NET 3.5.NET Extensibility 3.5ISAPI ExtensionsISAPI Filters同一个分类里还有 4.x 系列的对应项别勾错了。勾选完还要确认站点的应用池运行时版本选的是.NET CLR Version v2.0如果应用池跑在 v4.0 上2.0 编译的程序集加载会失败。三是 32 位与 64 位的问题。有些老应用是 32 位的对应的应用池需要开启启用 32 位应用程序选项。这个设置和应用池的位数是分开的很容易被忽略。四是版本混淆。再强调一次.NET 3.5 和 .NET 4.x 是完全独立的两套运行时。应用报需要 3.5检查的方向就是 v3.5 注册表键和C:\Windows\Microsoft.NET\Framework\v3.5目录如果它报的是 4.x 的问题那和这次安装没关系别在同一件事上钻牛角尖。我个人这几年处理下来最省心的做法是在公司内部维护一份标准化的组件源包——就是把同版本完整介质里的 sxs 目录抽出来单独放在内部文件服务器上配套一份操作说明和命令模板。新服务器要装 .NET 3.5直接从内部源复制 sxs 到本地跑一条命令重启验证全程十分钟以内。域策略、内网更新链路、外网连通性这些变量全部不参与出了问题也容易定位。这个思路在 Server 2016 之后的几个版本上一直适用值得花点时间建起来。另外提醒一句服务器做完组件变更之后记得在变更记录里写清楚装了什么、源来自哪里、是否重启过。下次同一个机房里另一台机器出同样的问题这份记录能让你少走一大半弯路。
返回列表