输入 Get-VpnConnection,什么也没返回,排查通常就停在这里。这个空结果被读成机器上根本没有 VPN 的证据,即使隧道正在承载流量。命令本身没问题;问题出在它列什么。它只读取一个作用域里的一个本机存储,对自带配置文件的客户端一无所知。

每次调用只读一个本机存储

先从最简单的调用开始,它针对当前登录账户的配置文件。大多数人第一步就运行它:

Get-VpnConnection

每个返回的对象都带 Name、ServerAddress、TunnelType 和 ConnectionStatus,这四个字段足以在工单里区分两条记录。配置文件可以几个月处于断开状态却仍留在列表里,因为对象描述的是保存的配置,而不是实时流量。这里的空结果只意味着该账户在每个用户的存储里什么都没有。这比人们通常从中读出的结论小得多。

所有用户的电话簿要单独查询

服务每个账户的配置文件位于另一个列表,默认调用从不读它;你需要显式请求那个存储。

Get-VpnConnection -AllUserConnection

会话缺少权限时,应预期出现拒绝访问错误而不是空结果,并把两种结果区别对待:一种表示你看不到,另一种表示没有任何保存。趁输出还在眼前,把作用域记在名字旁边,因为后续命令不会提醒你它查的是哪个存储。权限是同事能看见你看不到的配置文件的常见原因。参数集记录在 Get-VpnConnection 参考页 上,包括哪些开关属于哪个集合。

同名,两个不同的存储

配置文件的名字只在自己所属的存储内唯一,而不是整台机器,所以每用户列表和所有用户列表可以各有一个名为 Office 的配置文件。两条记录可能指向不同服务器、使用不同隧道类型、携带不同凭据。用户双击的只有其中一条。动手之前先记下作用域。

删掉没人运行的副本在更改窗口里看着无害。等到用户的快捷方式失效,它就变成一通支持电话。

从不接触本机列表的客户端

导入供应商客户端的 OpenVPN 或 WireGuard 配置文件 保存在该客户端自己的配置里,因此永远不会成为本机的 Windows 记录。客户端运行自己的服务、维护自己的列表,并通过自己的适配器转发流量。这些都不是命令报告的内容,任何作用域开关也不会让它显示出来。一台机器可以有三条正常工作的隧道和一个空的本机列表。

如果真正需要的是适配器视图,就去查适配器。供应商接口自己命名,所以匹配片段而不是精确字符串:

Get-NetAdapter | Where-Object InterfaceDescription -match 'WireGuard|OpenVPN|TAP'

手工创建的本机配置文件落在用户配置文件下的电话簿文件里,面向所有用户的对应项则在整台机器的副本中。这就是把一个用户的配置文件存储复制到另一个账户时很少重现同一份列表的原因。文件能解释一条走失的本机连接从哪来。它对供应商客户端的存储只字不提。

删除配置文件之前要记录什么

最便宜的保险是五个字段的备注:名称、作用域、服务器地址、状态,以及用户尝试时得到的准确错误文本。加上他们实际运行的客户端,因为这个细节决定本机记录到底有没有意义。没有它,即使删对了也会看起来像下一次故障的原因。备注要留在工单里,而不是聊天窗口。

删除只有一条命令,它会抹掉配置而不是禁用它。等那条备注存在之后再执行:

Remove-VpnConnection -Name "Office" -Force

目标位于所有用户的存储时加上 -AllUserConnection,并先把已批准的配置来源存到别处。然后重新连接一次并读取路由表,因为列表只能证明配置被保存了。流量是否真的到达服务器是另一个问题,任何数量的 Get-VpnConnection 输出都回答不了。如果用户在干净地重新添加之后仍然失败,那配置文件从来就不是问题。

相关文章