如何通过C#实现Always-On VPN的程序内主动连接功能
可行实现方案
方案1:调用rasphone命令行(兼容性最佳,支持Win7及以上系统)
你之前用rasdial失败是因为rasdial对Always On VPN这类现代VPN配置适配性较差,改用系统自带的rasphone命令即可稳定触发连接,对应命令如下:
- 连接命令:
rasphone -d "你的Always On VPN配置名称" - 断开命令:
rasphone -h "你的Always On VPN配置名称"
C#调用示例代码:
using System.Diagnostics; public void ConnectVPN(string vpnName = "Always-On VPN") { ProcessStartInfo psi = new ProcessStartInfo { FileName = "rasphone.exe", Arguments = $"-d \"{vpnName}\"", UseShellExecute = false, CreateNoWindow = true }; Process.Start(psi); // 调用后可延迟2秒调用你已实现的CheckForVPNInterface方法更新连接状态 }
方案2:调用WinRT原生VPN API(Win10 1709及以上系统推荐)
如果你的程序只需要适配Win10 1709及以上版本,可以直接调用Windows原生的VPN管理API,不需要依赖外部命令行,稳定性更高。
首先需要通过NuGet安装Microsoft.Windows.SDK.Contracts包引入WinRT API支持,对应实现代码:
using Windows.Networking.Vpn; using System.Linq; public async void ConnectVPNNative(string vpnName = "Always-On VPN") { VpnManagementAgent vpnAgent = new VpnManagementAgent(); var profiles = await vpnAgent.GetProfilesAsync(); var targetProfile = profiles.FirstOrDefault(p => p.ProfileName == vpnName); if (targetProfile != null) { await vpnAgent.ConnectProfileAsync(targetProfile); } }
注意事项
- 先确认系统中VPN配置的准确名称,必须和「网络和Internet设置」-「VPN」列表中显示的名称完全一致,空格、大小写不能有偏差,这是命令行调用失败的最常见原因
- 连接操作为异步执行,触发后可以间隔1-2秒调用你已实现的
CheckForVPNInterface方法轮询状态,更新UI显示即可 - 不需要管理员权限,普通用户即可触发已保存凭据的VPN连接操作
内容的提问来源于stack exchange,提问作者wads
相关产品推荐
相关产品推荐

