点击“连接”后,对话框几乎立刻弹出:无法初始化连接子系统。没有任何数据到达网关,因此对端既没有证书交换,也没有凭据,更没有隧道组选择。这意味着集中器的日志会显示一个空会话,而服务台会要求你提供一张从未包含任何有用信息的截图。与其如此,不如按固定顺序排查本机端点,并在第一个改变结果的位置停下。

时间线是你手上最有价值的证据,记录它不花任何成本。写下错误是在凭据提示之前还是之后出现,以及它是否始于某次升级、Windows 更新或新的安全代理。这三个答案通常能在一处设置都没动之前就把候选范围缩小一半。

先读时间线,再动手改动

三个故障点看起来相似,其实并不相同。如果对话框在你按下“连接”的瞬间出现,说明客户端没能启动自己的底层组件,这条消息正是指向这里。如果它在你输入凭据之后出现,说明已经到达隧道组,问题在更后面。如果隧道建立后又断开,说明子系统初始化正常,你在追的是完全另一个缺陷。把三者混为一谈,会浪费一个下午去做毫无帮助的重装。

只有第一种情况属于本文。这条消息在任何网络决策之前就已生成,所以错误的网关地址、过期的证书或错误的口令都不会触发它。

第 1 步:确认代理服务正在运行

你点击的窗口只是前端,真正的工作由 Cisco AnyConnect Secure Mobility Agent 服务完成,该服务注册名为 vpnagent。如果该服务已停止或被禁用,图形界面就没有可通信的对象,并会报告正是这个初始化失败。请在提升权限的 PowerShell 提示符中检查状态与启动类型:

Get-Service vpnagent | Select-Object Name, Status, StartType
sc.exe qc vpnagent
net start vpnagent

安装程序尊重了此前手动设置的启动类型,是它最终被禁用的常见原因,所以要检查 StartType,而不是只按“启动”。如果服务在几秒内启动又停止,请先阅读 System 日志中的 Service Control Manager 条目,再点“修复”:

Get-WinEvent -FilterHashtable @{LogName="System"; ProviderName="Service Control Manager"} -MaxEvents 40

被阻止的驱动、被隔离的文件或第三方安全产品的过滤驱动会在这些事件中自报姓名。“修复”只是在同一个被阻止的文件上重装,什么也改变不了,所以先看事件日志。

第 2 步:清除 HTTP 栈报告的离线状态

客户端通过 Windows HTTP 组件下载配置文件并评估策略,因此用户 Internet 设置里的离线标志可能破坏初始化,而所有浏览器仍能正常加载网页。直接检查该值:

Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name GlobalUserOffline

值为 1 表示 WinINet 栈正在告诉调用方本机没有连接;该状态通常由 Internet Explorer 的“脱机工作”菜单项或自动化脚本设置。把它改回 0,注销后重新登录,并在改动其他任何东西之前重试连接。

如果这台机器是继承来的,你也说不清标志为何被设置,请记进工单。机器上别的东西可能是有意设置的,下次登录它还会回来。

第 3 步:把虚拟适配器从 Hyper-V 或 ICS 手中释放出来

两个 Windows 角色可能占着客户端创建适配器所需的部件。第一个是 Hyper-V:当虚拟交换机服务运行时,适配器创建可能以这种错误的形式失败。停止服务是诊断手段,不是修复:

Get-Service vmms, vmcompute | Stop-Service
Get-NetAdapter | Where-Object InterfaceDescription -like "*Hyper-V*"

如果在停止这些服务后客户端能连上,冲突就得到确认,现在你知道该和 Hyper-V 主机的负责人谈什么了。除非机器不再需要虚拟化,之后请把这些服务重新启动。

Internet 连接共享是第二个占用者。如果有连接正被共享,客户端可能在建立隧道之前就失败。用 Get-Service SharedAccess 确认;若它正在运行且设为自动,请在适配器里找出被共享的连接,并且只在那块适配器上关闭共享。

还有一个更省事的解释需要先排除。完全无法上网的机器经常弹出这条消息,而不是可达性错误,所以在怪客户端之前,先确认 Test-NetConnection 到网关地址和到某个公网主机都成功。

验证,然后回滚你并不需要的改动

验证不是任务栏里的绿色盾牌。要确认适配器存在、拿到地址并能传流量:Get-NetAdapter -Name "Cisco AnyConnect*" 应显示它已启用,ipconfig /all 应显示分配的地址和 DNS 服务器,而对内部名称的真实请求应通过隧道解析,而不是走本地解析器。

边做边记一份简短清单,写清你看到的值和你设置的值。如果第三步之后连接正常,请在关闭工单前恢复 Hyper-V 服务并复测,因为悄悄关掉虚拟化的临时做法,会被下一个发现它的管理员撤销。

如果三步都没有推动错误,就停止改动端点。收集客户端版本、服务状态、本页开头的时间线,以及客户端能生成的诊断包,并把它们连同你尝试过的确切顺序一起移交。那份诊断包对下一位工程师的价值高于一张对话框截图,而且它是唯一能说明子系统是在接触网络之前还是之后失败的实物。

相关文章