你针对某个 VPN 配置文件执行命令,命令没有报错,而用户启动的连接行为与之前完全相同。并没有任何东西坏掉。Windows 把原生 VPN 配置文件保存在两个存储区中,而你编辑的是当前没有生效的那一个。同一个显示名称可以同时存在于两处,所以脚本看起来执行成功,用户的连接却忽略了你做的每一处改动。

解决办法不是换一个更好的脚本,而是在给配置文件命名之前先说明作用域。

症状与两个存储区

Windows 把原生 VPN 配置文件保存在每用户的电话簿和一台机器上所有用户的电话簿中。Get-VpnConnection 读取当前用户的存储区,Get-VpnConnection -AllUserConnection 读取机器级的存储区。

用 -AllUserConnection 创建的配置文件会出现在机器上的每一个账户中,创建或删除都需要提升权限的会话。不带该参数创建的配置文件属于执行命令的那个账户,其他用户登录后完全看不到它。两者可以同名,而且谁都不会提醒你另一个的存在。这就是为什么症状看起来像静默失败,而不是一条错误消息。

作用域实际决定什么

作用域回答两个问题,并拒绝回答第三个问题:

QuestionCurrent userAll users
Who can see the profileThe account that created itEvery account on the machine
Elevation to create or removeNot requiredRequired
Where the profile livesPer-user phone bookMachine-wide phone book
Does it authenticate a deviceNoNo
Does it start before sign-inNoNo, that needs a device tunnel

人们在最后两行上最容易出错。全用户配置文件是机器级作用域的存储,而不是机器身份,它本身并不会让连接在任何人登录之前就可用。Windows Always On 设备隧道是单独的配置,有自己的证书和配置文件要求。作用域讲的是谁能看到配置文件,而不是这台机器是什么。

可见性不等于身份验证

全用户配置文件仍然需要受支持的身份和凭据安排。让每个账户都能看到该配置文件,并不会让每个账户成为同一个已通过身份验证的用户,也不会共享凭据。

如果设计要求在登录之前就建立隧道,答案就是设备隧道,而不是更宽的配置文件作用域。如果设计要求每个人出示自己的证书,那么每用户配置文件更符合这种模型,因为机器级配置文件无法出示属于别人的凭据。

部署与策略归属

在受管理的机器上,EMM 或配置描述文件可能会在你的改动之后重新创建已保存的状态。

这不是你脚本里的缺陷,而是两个所有者在写同一个存储区。与策略的所有者协调作用域,并优先修改策略,而不是按计划反复运行你的命令。与策略相竞争的本地修复,会造出一台在下次同步之前看起来正确的机器。

出问题时该记录什么

把三件事记在一起:配置文件名称、你针对的作用域,以及实际的连接错误。

应用到另一个存储区中配置文件的路由或证书,修复不了用户启动的那个连接,错误文本会继续指向连接,而不是你的修改。经过批准的改动之后,请通过预期的入口重新连接,并同时检查已应用的路由和已保存的设置。配置文件存储区回答的是有什么可用,而 活动连接回答的是设备此刻在做什么。

Microsoft 关于 Add-VpnConnection 的文档把作用域开关列在它所修改的参数旁边,这提醒我们:作用域是创建时的决定,而不是之后随手切换的设置。

相关文章