简介:面向华为视讯管理系统SMC2.0的实施与运维人员,这份Word文档聚焦单机部署前的操作系统和数据库环境准备,帮助读者按Windows Server 2012 R2、2016、2019三种平台搭配对应SQL Server Express版本完成安装、升级与基础配置。内容按环境组合展开,涵盖标准版系统安装、SQL Server Express部署、数据库管理工具使用,以及从SQL Server 2008 Express升级至2014 Express的数据迁移与兼容性验证;另设典型安装升级失败FAQ,涉及系统不支持、安装进度9%报错、.NET Framework与VC运行库缺失、BCP路径异常、证书导入失败、数据库连接超时等场景,并提供排查思路。资源包仅含1个docx文件,大小约11.66MB,目录层级清晰,便于按版本和故障现象检索。已有752人学习,适合需要规范化搭建SMC2.0单机环境、减少重复排错的中初级实施运维人员参考。
1. 装到 9% 就停:单机版视讯管理系统为什么总在同一个位置翻车
装单机版视讯会议管理系统(下文按安装包前缀简称 SMC),最让人抓狂的不是哪一步参数填错,而是进度条永远停在 9%。前面选目录、选组件、点下一步都很顺,一到 9% 就弹框,有时说系统加固失败,有时说计算机名和登录用户名一致,有时干脆什么都不说直接回滚重来。折腾两三个小时,机器上留下一堆半装状态的服务和注册表项,越装越乱。
这类故障的共同点是:9% 之前安装程序只做文件释放,9% 之后才开始动操作系统底层——写安全策略、装 VC 运行库、起服务、连数据库、导证书。环境只要有一项没对齐,全部集中在这一步爆出来,而且报错文案各不相同,很容易误判成"安装包坏了"。这篇就是把这串报错按现场顺序拆开,每一类说清楚触发条件、根因、怎么改、改完怎么验证,照着做能少走几轮重装。
2. 环境对表:操作系统、数据库版本与补丁怎么配才不会返工
SMC 单机版是把应用、数据库、管理工具塞在同一台机器上的部署形态,它和"应用装一台、数据库装一台"的最大区别是:所有版本约束都压在一个操作系统上,任何一层不满足,安装程序在预检查阶段就会拦你,或者更糟——放你过去,到 9% 再翻车。所以我每次动手前的第一件事不是双击安装包,而是把操作系统版本、补丁级别、数据库版本、管理工具版本四样东西列成一张表,逐项打勾。这一步多花十分钟,能省掉后面两小时的重装。
2.1 三套推荐组合与它们各自的前置条件
安装指导里给出的推荐组合有三套,分别对应三个时代的 Windows Server。选哪套不是看机器新旧,而是看你的 SMC 版本支持到哪一档,以及现场有没有现成的操作系统镜像。
| 操作系统 | 数据库 | 适用说明 |
|---|---|---|
| Windows Server 2012 R2 标准版 | SQL Server 2014 Express SP2 | 存量环境最多的一套,补丁链最长,升级路径也最完整 |
| Windows Server 2016 标准版 | SQL Server 2016 Express SP2 | 安全特性更全,注意 Windows Update 策略会干扰安装 |
| Windows Server 2019 标准版 | SQL Server 2019 Express | 新装机首选,数据库功能最全,但对旧版 SMC 兼容性要先确认 |
三套组合有几条共同的前置条件,漏一条都可能让安装在中途停住。第一是磁盘,系统盘建议不少于 80 GB,安装程序会往 C 盘写临时文件、数据库文件、证书和日志,空间不够时表现出的不是"磁盘不足"这种明确报错,而是各种莫名其妙的写入失败。第二是语言,数据库的排序规则和语言必须和操作系统语言保持一致,中文系统配英文数据库实例,后面建库时排序规则冲突的概率很高。第三是补丁,操作系统补丁必须按顺序逐个双击安装,中途提示重启就先重启再继续,补丁文件所在路径不能带中文字符。
# 确认系统版本、构建号和补丁级别,先确认自己在哪一档 Get-ComputerInfo | Select-Object OsName, OsVersion, OsBuildNumber # 查看系统盘可用空间,低于 80 GB 建议先扩盘再动手 Get-PSDrive C | Select-Object @{n='FreeGB';e={[math]::Round($_.Free/1GB,1)}}第一条命令输出里的 OsName 是营销名称,OsBuildNumber 才是判断补丁级别的依据,比如 Windows Server 2012 R2 的初始构建号是 9600,打完 KB2919355 之后会变。第二条命令只看可用空间,不看总容量——很多人拿一块 100 GB 的盘分区给 C 盘 60 GB,总容量看着够,可用空间不够,一样会在安装中途失败。
补丁安装过程中有两个"假报错"要认出来:提示 "The update is not applicable to your computer" 或者 "xxxx is already installed on this computer",说明这个补丁要么不适用于当前架构,要么已经装过了,直接跳过装下一个,不用去查资料。全部补丁装完必须重启一次,让待生效的更新落地,否则安装程序读到的还是旧的组件版本。
2.2 报"SMC 不支持当前操作系统"时,该怎么核对版本
这个报错是安装预检查阶段最常见的一条,也是最容易被误判的一条。很多人看到它第一反应是"我装的明明是 Windows Server 2016 啊",然后开始怀疑安装包。实际上安装程序判断的从来不是"Windows Server 2016"这几个字,而是四个维度同时比对:主版本号、版本类型(标准版 / 数据中心版)、安装选项(带 GUI 还是 Server Core)、补丁级别。
最容易踩的两个坑,一个是 Server Core。安装镜像里有两个选项,"Server Core Installation" 是纯命令行、没有桌面,选它装完是没有图形界面的,SMC 的安装向导根本起不来,表现出来就是各种"不支持"。必须选 "Server with a GUI",也就是带桌面的服务器安装。另一个是版本类型,标准版和数据中心版在功能上差别不大,但支持矩阵里写的往往只有标准版,遇到数据中心版被拦下来,要么换镜像,要么按现场支持范围确认清楚再装。
# 三个值要一起看:版本类型、安装类型、当前构建号 (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').EditionID (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').InstallationType [System.Environment]::OSVersion.VersionEditionID 返回 ServerStandard、ServerDatacenter 这类值,InstallationType 返回 Server 或 Server Core,这两个值一组合,就能判断出你这台机器到底在不在支持列表里。如果是 Server Core,唯一的解法是重装系统选带 GUI 的版本——没有后悔药,Server Core 加装图形界面在服务器版上是不支持的。如果版本类型对、安装类型也对,那问题就落在补丁级别上,把补丁按顺序补齐再试。
2.3 SQL Server 与管理工具安装时的两个必看检查项
数据库这一层的安装,绝大部分步骤保持默认就行,但有两处必须停下来看一眼,它们直接决定后面 SMC 能不能连上。
第一处是"安装规则检查"界面里的防火墙状态。如果这一项显示"警告",说明机器防火墙没关,此时直接点下一步,后面大概率会在连接数据库那一步超时。正确做法是关掉防火墙,然后点"重新运行",直到防火墙状态变成"已通过"再继续。这个动作很多人会跳过,理由是"我本地连又不走网络",但安装程序用的是 TCP 连接,防火墙规则一样会拦。
第二处是"数据库引擎配置",这里必须选混合模式登录,并给 sa 账户设一个符合复杂度要求的密码。选成"仅 Windows 身份验证"的话,安装能过,但 SMC 的应用服务用 SQL 账户连库时会直接被拒,报出来的错误是登录失败,排查方向会被带偏到账号权限上。sa 密码按规范设置,长度 8 位以上、含大小写和符号,别用纯数字,也别带中文字符;指导文档里给的那个示例口令只是演示用,现场部署一定要改掉。
# 2014/2016/2019 Express 的实例 ID 分别是 MSSQL12/MSSQL13/MSSQL14 加 .SQLEXPRESS $inst = 'MSSQL14.SQLEXPRESS' # LoginMode = 1 表示仅 Windows 认证,= 2 表示混合模式 Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$inst\MSSQLServer" -Name LoginMode如果这一步查出来是 1,不用重装数据库,在 SQL Server 配置管理器里把实例的登录模式改成混合模式,重启实例,然后到 SSMS 里把 sa 启用并设密码即可。改完一定要重启实例,注册表值改了不生效是这个场景里最常见的"改了没用"。
另外提一句管理工具。安装 SQL Server 管理工具(SSMS)时,特性检查有可能报 .NET Framework 3.5 相关的错误代码 0x800F0906 或 0x800F081F,本质是系统里没启用 .NET 3.5 这个可选功能。解法是打开服务器管理器,添加角色和功能,勾选 .NET Framework 3.5,然后在"指定备用源路径"里挂载操作系统的 ISO 镜像,把路径指到镜像里的 sources\sxs 目录,装完再回到安装程序里重新检查就能通过。这一步在离线环境里几乎必踩,提前把 ISO 准备好能省一次返工。
3. 卡在 9%:加固失败、计算机名同名与运行库装不上的解法
9% 这个位置之所以特殊,是因为从这一刻开始,安装程序不再只是往磁盘写文件,而是开始调用操作系统 API 去改配置、装依赖、起服务。任何一个调用失败,整个安装就会回滚或者挂起。这一章的四类报错,占了现场故障的大头,而且它们的报错文案都不带"9%"字样,很多人是装完之后才反应过来"哦,就是卡在 9%"。
3.1 9% 报"无法在当前操作系统应用系统加固"
系统加固指的是安装程序按内置的安全基线去改本地安全策略:密码复杂度、账户锁定阈值、审核策略、部分注册表权限。它失败的原因不是安装包有问题,而是当前系统的策略状态和基线对不上,改不动。
最常见的三种情况:一是操作系统补丁没打齐,基线里要写的某个策略项在当前版本上字段结构不一样,写入直接失败;二是机器加入了域,域的组策略每 90 分钟刷新一次,安装程序刚改完,组策略一刷新又覆盖回去,表现出来就是改完立刻失败;三是有人手工动过本地安全策略,把某些项设成了"未定义"或者一个基线不认的值。
# 导出当前本地安全策略,和安装包里的基线文件对比差异 secedit /export /cfg C:\temp\local_baseline.inf /areas SECURITYPOLICY # 查看密码策略、账户锁定策略这几段,重点看是否被域策略接管 Select-String -Path C:\temp\local_baseline.inf -Pattern 'Password|Lockout|MinimumPassword'导出之后重点看有没有被域策略覆盖的痕迹。判断方法很简单:把机器临时退出域(或者拔掉网线、停掉域控连通),再跑一次安装,如果这时候 9% 能过,那就百分百是组策略冲突。现场的临时处理是断开域连接再装,装完重新加域;长期处理是把这条加固基线纳入域策略,避免两边打架。补丁级别的问题只能靠把补丁按顺序补齐来解决,没有捷径。
3.2 9% 报"计算机名和当前登录用户名一致"
这条报错文案看着很无厘头,但它确实是安装失败的直接原因。安装程序在创建数据库登录名和服务账户时,会把当前登录的管理员用户名作为标识之一拼进去,如果计算机名和这个用户名完全相同,拼出来的两个标识就撞了,脚本执行时直接抛错。
现场很容易撞上:装机的时候图省事,计算机名起成 Administrator,登录账户也是 Administrator;或者反过来,用某个业务名做计算机名,又建了个同名管理员账户。改法有两个,任选其一:改计算机名(推荐,改完必须重启),或者换一个不同名的管理员账户登录再装。
# 当前计算机名 $env:COMPUTERNAME # 当前登录账户(去掉域名前缀) (whoami).Split('\')[-1] # 列出所有本地管理员,找一个和计算机名不同的来装 Get-LocalGroupMember -Group Administrators | Select-Object Name改计算机名之后一定要重启,不重启的话很多组件缓存的还是旧名字,安装程序读到的值不会变。另外提醒一点,计算机名不要用中文、不要带特殊字符、不要超过 15 个字符,这几个限制在数据库和服务的命名上会一路传下去,后面改起来非常麻烦。
3.3 Install VC2017 x86 depend files 失败
这条报错通常出现在加固步骤之后,安装程序开始装它自带的 VC++ 2017 运行库时失败。注意关键词是 x86——即使你的操作系统是 64 位,安装程序依赖的某些组件仍然是 32 位的,必须装 x86 版本的运行库,只装 x64 版本不管用。
失败的常见原因有四个:机器上已经有更高版本的 VC 运行库,安装程序判定冲突;Windows Update 服务被禁用,运行库安装包依赖它去校验组件存储;系统缺少某个前置补丁,安装包直接拒绝执行;以及杀毒软件把安装包释放出来的临时 exe 拦了。
# 查已安装的 Visual C++ 运行库版本,重点看 2017 x86 在不在 Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName -like '*Visual C++ 2017*' } | Select-Object DisplayName, DisplayVersion如果列表里已经有 VC++ 2017 x86 但版本比安装包要求的高,一般可以跳过这一步继续装,很多时候后续步骤并不会真的用到。如果列表里没有,最稳的做法是去微软官网单独下载 VC++ 2017 x86 可再发行组件包,手工装一遍,装完重启,再重新跑 SMC 安装程序。手工装的好处是失败的时候有明确错误码,而不是被包在安装程序里只给一句"depend files 失败"。另外确认一下 Windows Update 服务和 Windows Modules Installer 服务是启动状态,这两个服务被优化脚本关掉的情况在交付现场非常普遍。
3.4 报"The net service has not been started, please check!"
这条报错的字面意思很直接:某个 net 相关的服务没起来。但它指向的服务名不唯一,需要按顺序排除。
首先查 Server 服务(服务名 LanmanServer),这是文件共享服务,安装程序在释放文件和写共享目录时依赖它,被安全基线或者优化脚本禁用的情况最多。其次查 NetTcpPortSharing,这是 WCF 的端口共享服务,SMC 的服务端通信组件有一部分走这个。最后才怀疑 .NET 本身,如果 .NET Framework 装得不完整,相关的服务注册项根本不存在,表现出来也是"服务没起来"。
# 三个候选服务逐个看状态和启动类型 Get-Service -Name LanmanServer, LanmanWorkstation, NetTcpPortSharing -ErrorAction SilentlyContinue | Select-Object Name, Status, StartType # 手动拉起并设为自动 Set-Service -Name LanmanServer -StartupType Automatic Start-Service -Name LanmanServer处理完之后不要直接点"重试",把安装程序完全退出去再重新启动,让它的服务状态检查从头跑一遍。有些现场是服务能起来,但启动类型是"手动",安装程序判断时看的是启动类型,一样会拦。这类环境通常是被人跑过一轮"服务器安全加固脚本",把几十个服务统一设成了禁用,遇到这种情况建议先还原一份干净的系统再装,比逐个排查快得多。
4. 反复重启与找不到文件:安装中途停下来的四种现场
第 3 章讲的是安装程序主动报错,这一章讲的是更难受的一类:它不报错,就是不往前走。有的是机器反复重启,重启完从头再来;有的是卡在某个进度一动不动;有的是到最后一步失败,日志里只留下一句"找不到文件"。这类问题的排查难度在于,现象和行为之间隔了一层,你得先搞清楚安装程序在等什么资源。
4.1 安装过程中不断重启
循环重启是最好认也最费时间的一种:装到某一步,机器自动重启,重启后安装程序又重新开始,装到同一步又重启。放着不管能循环一整天。
根因基本只有一个:安装包同级目录下缺少它需要的依赖安装包,安装程序找不到,就按"这部分没装成"处理,把机器重启一次再试,结果还是一样。这份指导文档里明确列了两项:.NET Framework 4.7.2 离线安装包和 SQL Server 2014 Express SP2 安装包。安装程序在启动时会去约定的目录下找这两个包,找不到就自己触发重启流程。
# 查 .NET Framework 4.x 的 Release 值,461808 = 4.7.2、461814 = 4.7.2(其他OS)、528040 = 4.8 $rel = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release).Release "当前 .NET 4.x Release = $rel" # 查 SQL Server Express 实例是否已存在 Get-Service -Name 'MSSQL*' -ErrorAction SilentlyContinue | Select-Object Name, Status处理方式是把这两个离线包下载好,放到安装包目录下约定的位置(一般和主安装程序同级),文件名不要改,然后手工先装一遍 .NET 4.7.2,重启,再装 SQL Server Express,再重启,最后跑 SMC 安装程序。手工先装的好处是能提前暴露这两个组件自身的安装问题,而不是被包在 SMC 安装流程里来回重启。Release 值小于 461808 就说明 .NET 版本不够,别凭"我记得装了"下判断。
4.2 BCP 不是默认路径导致安装失败
BCP 是 SQL Server 自带的批量导入导出工具,安装程序在校验数据库可用性时的一部分逻辑,会直接调用 bcp 命令去做一次小规模的数据往返测试。调用方式是裸写 bcp,不走绝对路径,依赖的是系统的 PATH 环境变量。
如果安装 SQL Server 时改了默认安装路径,bcp.exe 就不在 C:\Program Files\Microsoft SQL Server\120\Tools\Binn 下面了,PATH 里也没有它,安装程序一调就失败,报错内容通常只说"数据库校验失败"或者干脆是别的错误,很容易被带偏。
# 看 bcp 能不能直接调起来 where.exe bcp # 查 SQL Server 的实际安装根目录 Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL' | Select-Object MSSQLSERVER, SQLEXPRESSwhere.exe bcp没有输出,就说明 PATH 里没有。两种改法:把 bcp.exe 所在目录加进系统 PATH(推荐,一劳永逸),或者把 bcp.exe 及其依赖的几个 dll 复制到默认路径下。改完之后要重新开一个命令行窗口验证——PATH 是进程级快照,已经打开的窗口读不到新值,这是这一步最常见的"改了没生效"。改完再重启安装程序,它启动时会重新读环境变量。
4.3 提示访问安装目录下的文件夹失败
现象是安装到某一步,弹出访问某个文件夹被拒绝,文件夹名字看着像安装包解压出来的二级目录,路径里往往带着空格或者特殊字符。
原因集中在三处。一是解压路径本身有问题,装上桌面的安装包解压在"新建文件夹 (2)"这种带括号和空格的路径下,安装程序的某些脚本对路径转义处理不严,解析出错。二是权限,安装程序切换到了一个权限较低的服务账户去写文件,而这个目录的 ACL 没给它写权限。三是杀毒软件实时防护把安装程序释放的临时文件锁住了,写不进去。
# 把安装包放到纯英文、无空格的短路径下,比如 C:\smc_install New-Item -ItemType Directory -Path C:\smc_install -Force # 查看目录 ACL,确认 SYSTEM 和 Administrators 有完全控制 icacls C:\smc_install # 如有必要,给 SYSTEM 补上完全控制 icacls C:\smc_install /grant 'SYSTEM:(OI)(CI)F' /T最省事的做法其实是第一条:把安装包挪到 C:\smc_install 这种路径下重新解压再装,很多"权限问题"根本不是权限问题,就是路径太花。挪之前先把杀软的实时防护暂停,装完再开回来,并把安装目录加入白名单,避免装完之后运行期又被拦。
4.4 连接数据库超时、提示登录超时
这条报错出现在安装后期,安装程序要连上刚装好的 SQL Server 实例建库建表,连不上就超时。它和 2.3 节的防火墙检查是同一类问题在不同阶段的表现,但排查面更宽。
按顺序查四件事。第一,实例的 TCP/IP 协议有没有启用,Express 版默认是禁用的,必须去配置管理器里手动打开并重启实例。第二,SQL Browser 服务有没有起,named instance 靠它把 1433 之外的动态端口告诉客户端。第三,防火墙有没有放行,或者干脆关掉。第四,认证模式和安全连接,混合模式没开、sa 被禁用、密码里带特殊字符导致连接串解析失败,都会落到同一个"登录超时"上。
# 直连实例名,验证通道是否通 Test-NetConnection -ComputerName 127.0.0.1 -Port 1433 # 用 sa 连接并跑一条最简单的查询,验证认证模式 sqlcmd -S 127.0.0.1\SQLEXPRESS -U sa -P "<你的sa密码>" -Q "SELECT @@VERSION" -l 10第一条命令看 TcpTestSucceeded 是不是 True,不通就说明协议或端口有问题,先别去查账号。第二条命令如果报"用户登录失败",说明网络是通的、认证模式或密码有问题;如果直接报超时,说明网络层就没通。这个二分法能把排查范围一次性砍一半,比在日志里翻来翻去快。sqlcmd 命令里的 -l 10 是把登录超时设成 10 秒,默认值是 30 秒,装现场等三次就十分钟没了。
5. 升级阶段的避坑清单:五个最容易翻车的环节
全新安装和版本升级是两套完全不同的难度。全新安装面对的是空白系统,失败了大不了重装;升级面对的是已经在跑业务的库,动之前得留后路,动完之后还得验证数据没丢。这份指导文档里列出的升级类报错有七八条,我把现场命中最高的五条拎出来,每条按"现象、原因、怎么解"三段说清楚。
5.1 坑一:升级过程中弹出输入认证密码框
现象是升级向导跑到某一步,突然弹出一个输入认证密码的框,界面上没有任何说明,密码填什么都过不去,点取消则整个升级回滚。
原因基本是升级前的那台机器,SMC 内部的服务间通信凭据还是旧版本生成的,升级程序需要它来接管已有的数据库连接,但凭据文件和当前环境对不上。常见触发场景是升级前改过管理员密码、改过计算机名,或者把安装目录整体复制到过另一台机器。
处理办法是不要在这个框里瞎试密码。退出升级程序,用安装用户(必须和最初安装时的账户一致)重新登录系统,确认 UAC 关闭,再以管理员身份启动升级程序。如果还弹,说明凭据文件已损坏,按指导文档里的处理方式,先把数据库完整备份,再用新版本安装包做一次"覆盖安装 + 数据恢复",而不是硬走升级路径。备份这一步不要省,升级出问题至少有回头路。
5.2 坑二:SMC 数据库状态和文件状态不一致
现象是升级前的环境检查报"数据库状态和文件状态不一致",或者升级完成了但登录进去发现部分配置丢失。
原因是有两处状态记录:一处存在数据库里,一处存在安装目录下的配置文件里,两者本应同步。手工改过配置文件、数据库被还原过、或者上次升级中途失败回滚不彻底,都会让两边对不上。
处理方式是先只读比对,不动手。连上数据库查一遍当前版本号和配置项,再去安装目录下看对应配置文件里的版本号,两个值不一样就是这个问题。修复的原则是以数据库为准,把配置文件按数据库里的值手工对齐,然后重启 SMC 的所有服务再跑升级。绝对不要反过来改数据库去迁就配置文件,那是拿数据开玩笑。
5.3 坑三:执行脚本 ViewAndStoredprocedure.sql 失败、创建数据库失败
现象是升级到执行脚本这一步,报执行 ViewAndStoredprocedure.sql 失败;或者初始化阶段直接报创建数据库失败。这两个报错经常成对出现,因为后者往往是前者的结果。
原因是数据库连接用的账户,权限不够建视图和存储过程。升级程序默认用 sa 或安装时配置的账户去连,如果中途有人改过 sa 密码、禁用过 sa,或者把数据库的所有权改到了别的登录名下,脚本执行就会被拒。
-- 先确认当前连接身份和数据库所有权 SELECT SUSER_SNAME() AS 当前登录, DB_NAME() AS 当前库; SELECT name, SUSER_SNAME(owner_sid) AS 数据库所有者 FROM sys.databases WHERE name = 'SMC';如果当前登录不是预期账户,说明升级程序读到的连接串和你以为的不一样,去检查配置文件里的数据库连接配置。如果数据库所有者不是 sa,用 ALTER AUTHORIZATION 改回来再跑升级。另外注意 ViewAndStoredprocedure.sql 这类脚本执行失败时,日志里通常只给第一行错误,后面全是级联失败,别逐条去查,只查第一条。
5.4 坑四:安装或升级过程中导入证书失败
现象是导入证书这一步直接报错,升级中断,回滚。
证书导入失败的原因比想象中多:证书文件被杀软隔离、证书文件所在目录权限不足、证书已经过期、证书链不完整(中间证书缺失)、系统时间被改到了证书有效期之外。最后这个最隐蔽,现场有人为了绕开某些授权校验把系统时间调前了两年,结果证书校验直接失败。
处理顺序是先看系统时间对不对,再看证书有效期,再看证书链。用 certutil 把证书信息打出来,一眼就能看到有效期和颁发链。证书过期或者链不完整,只能换证书,改不出来。文件本身没问题的话,把证书导入到"受信任的根证书颁发机构"和"个人"两个存储区,别只导一个。
5.5 坑五:升级卡在导入证书环节不返回
现象和上一条不同:不报错,进度条停在导入证书,十几分钟没动静,CPU 和磁盘都不忙。
原因是证书链校验时去联网查 CRL(证书吊销列表),而现场机器不通外网,也不通内网的 CRL 发布点,系统就在那里一直等超时,超时时间默认很长,表现出来就是卡死。
处理办法是在证书导入前,先把系统的"检查服务器证书吊销"关掉,或者给机器配一个能到达的 CRL 地址。现场的临时做法是断开网络再导入——断网后系统找不到 CRL 服务器会快速失败并跳过,而不是傻等。导入完成后再恢复网络。这个坑的恶心之处在于它没有任何错误信息,你不知道它在等什么,所以升级前把网络策略确认一遍,比事后猜快得多。
6. 快速定位:三分钟判断卡在环境、服务还是数据库
装多了会发现,这几类故障其实可以按"层"来分:最上面一层是操作系统和版本,中间一层是服务和运行库,最下面一层是数据库和证书。报错文案几乎不告诉你它在哪一层,但你可以用一组固定命令,三分钟内把范围砍到一层,再往下查。
我习惯的顺序是这样的:先看系统版本、补丁、磁盘这三项,任何一项不达标立即停手,不用往下查;再看 .NET 版本、VC 运行库、三个关键服务的状态;最后看数据库实例、1433 端口、sa 是否可用。这三步对应三个不同的责任人,环境问题找装机的人,服务问题自己解决,数据库问题找 DBA 或者重装数据库。
| 排查层 | 检查项 | 典型报错 |
|---|---|---|
| 操作系统层 | 版本类型、安装类型、补丁构建号、C 盘可用空间 | 不支持当前操作系统、无法应用系统加固 |
| 组件与服务层 | .NET 4.7.2、VC++ 2017 x86、Server 服务、NetTcpPortSharing | depend files 失败、net service 未启动 |
| 数据库与证书层 | 实例状态、TCP/IP 协议、1433 端口、混合认证、证书有效期 | 登录超时、创建数据库失败、导入证书失败 |
# 一段脚本把三层的关键值全打出来,装现场直接复制粘贴 $os = Get-ComputerInfo | Select-Object OsName, OsBuildNumber $rel = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release).Release $svc = Get-Service LanmanServer, NetTcpPortSharing -ErrorAction SilentlyContinue $sql = Get-Service -Name 'MSSQL*' -ErrorAction SilentlyContinue $port = Test-NetConnection -ComputerName 127.0.0.1 -Port 1433 -WarningAction SilentlyContinue [pscustomobject]@{ OS名称 = $os.OsName 构建号 = $os.OsBuildNumber NET版本 = if ($rel -ge 461808) { '4.7.2 及以上' } else { '不满足,需升级' } 计算机名 = $env:COMPUTERNAME 登录账户 = (whoami).Split('\')[-1] 关键服务 = ($svc | ForEach-Object { "$($_.Name)=$($_.Status)" }) -join '; ' 数据库服务 = ($sql | ForEach-Object { "$($_.Name)=$($_.Status)" }) -join '; ' 1433通不通 = $port.TcpTestSucceeded } | Format-List这段脚本的价值不在于它多复杂,而在于它把三层的判断标准固化下来了,不用每次凭记忆一个个查。其中 NET版本 那个判断用的是 461808 这个分界值,低于它的机器不用往下看,先装 .NET 再谈别的;1433通不通 为 False 的时候,所有"登录失败"类的报错都要先当网络问题处理,别一上来就去改账号权限。计算机名和登录账户两个字段放在一起,就是为了当场看出 9% 那条同名报错。
踩过几次坑之后,我现在拿到一台机器,不管装什么版本,都会先跑一遍这套检查,把输出存成一份 txt 放在安装目录旁边,装完再跑一遍对比。血泪经验是:你永远记不清装之前那个构建号是多少,而事后想回溯的时候,那台机器已经被改得面目全非了。留一份装前基线,比任何日志分析工具都管用。希望这套顺序能帮到你,下一次再看到 9% 停住的时候,不用从头开始猜。
本文还有配套的精品资源,点击获取