新的 VPN 出现了,身份验证也正常,而一台机器上用了两年的第三方 VPN 却在同一次重启中消失。部署日志里对此只字未提,因为部署过程从未处理过它。安装包替换了全局电话簿,而另一个连接正是那个文件里的一条记录。这就是一次复制操作,其行为完全符合复制操作应有的样子。

解决办法不是做一次更好的复制,而是不要复制这个文件。

电话簿里究竟装着什么

电话簿是一个连接定义的容器,而不是一个配置文件。每用户条目位于用户配置文件之下,而 所有用户条目位于机器范围的 ProgramData 路径之下,这就是为什么写入该文件的部署会一次性触碰到所有本地用户。同一个文件还承载着其他厂商创建的条目,附带损伤正源于此。

连接定义也不是事情的全部。路由、DNS 策略、受信任的 CA 材料和身份由不同的责任方分别提供。

弄清配置文件归哪个作用域所有

在动笔之前,先把两个作用域都列出来。Get-VpnConnection 返回当前用户的条目,而 Get-VpnConnection -AllUserConnection 返回机器范围的条目;同一个名字可以在两边同时存在,且设置不同。确定你的部署归哪个作用域所有并写下来,因为更新错误的作用域会让用户继续用旧配置文件连接,而你的改动躺在一个没人读的文件里。以 SYSTEM 身份运行的计划任务 看到的配置文件集合也与已登录用户不同。

把归属方点明,正是防止下一位工程师重蹈整文件复制的关键一步。

只创建或更新那个具名连接,别的都不做

对于原生 Windows 配置文件,Add-VpnConnection 会创建一个条目,而 -AllUserConnection 选择机器范围。先用 -WhatIf 运行一次,让预览落在你的记录里,而不是落在用户的投诉里:

Add-VpnConnection -Name 'Office VPN' -ServerAddress 'vpn.example.com' -TunnelType Ikev2 -AuthenticationMethod Eap -EapConfigXmlStream $approvedEapXml -AllUserConnection -WhatIf

EAP XML 必须来自正当来源:从可用的参考配置文件导出,或由你的管理工具针对真实网关生成。服务器信任设置不正确,配置文件要么连到错误的对象,要么处处失败,两者都算不上部署成功。

当条目已经存在时,比较其设置并用 Set-VpnConnection 更新,而不是删除后重建。删除正是让一份能用的配置丢掉没人记录过的字段的原因,也是让无关条目被大范围清理波及的原因。

检查是否存在第二个管理系统,它会在下次策略刷新时把旧配置文件放回去。试点失败往往就败在这一步,而不是败在 cmdlet 上。

在一台已有其他 VPN 的机器上试点

挑一台带有无关的系统级条目的测试机,部署,然后验证三件事:新配置文件出现在预期作用域中,身份验证能够到达私有资源,无关条目依然能连接。再部署两次,确认第二次运行只改动它自己拥有的配置文件。这第三项检查能抓出那种对自家条目幂等、对其它一切毁灭性的安装包。

移除遵循同样的规则:Remove-VpnConnection -Name 'Office VPN' -AllUserConnection 只让一个条目退役,其余文件内容不受影响。

把先前的目标配置保留在手边,这样有范围的回滚只是重新导入一个配置文件,而不是恢复整台机器的状态。

相关文章