You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:30:01