在 C# 中获取 Windows VPN 接口

Hun*_*unv 2 c# vpn networking adapter

我尝试获取所有网络接口,我在窗口中看到所有网络适配器。如果我使用

NetworkInterface.GetAllnetworkInterfaces() 
Run Code Online (Sandbox Code Playgroud)

我只得到 LAN 适配器和环回。但是我没有得到我配置的 VPN 连接。VPN 连接是我需要的东西,但我找不到获取它们的方法(即使它们已断开连接)。

是否有类似于NetworkInterface.GetAllnetworkInterfaces()获取 VPN 连接的东西?

MrM*_*MAG 5

在 Windows VPN 接口存储在拨号电话簿文件中
通过 Windows 中的网络连接实用程序创建的所有 VPN 接口将存储在存储在 (Windows 7/8) 的默认 .pbk 文件中:

"C:\Users\%username%\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk"

该文件包含纯文本,可能如下所示:

 [VPN Connection]
 Encoding=1
 PBVersion=1
 Type=2
 AutoLogon=0

 <...omitted...>

 [VPN Connection 2]
 Encoding=1
 PBVersion=1
 Type=2
 AutoLogon=0
Run Code Online (Sandbox Code Playgroud)

1:您可以读取此文件的所有内容并使用这样的 RegeX 过滤连接名称\[(.*?)\]

正则表达式示例:

using System.Text.RegularExpressions;

namespace ListVPNConnections
{
    class Program
    {
        static void Main()
        {
            // VPN adapters are stored in the rasphone.pdk
            // "C:\Users\Me\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk"
            string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) +
                          @"\Microsoft\Network\Connections\Pbk\rasphone.pbk";

            const string pattern = @"\[(.*?)\]";
            var matches = Regex.Matches(System.IO.File.ReadAllText(path), pattern);

            foreach (Match m in matches)
                System.Console.WriteLine(m.Groups[1]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2:或者使用像DotRas这样的框架。

DotRas 示例:

using DotRas;

namespace ListVPNConnections
{
    class Program
    {
        static void Main()
        {
            // VPN adapters are stored in the rasphone.pdk
            // "C:\Users\Me\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk"
            string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) +
                          @"\Microsoft\Network\Connections\Pbk\rasphone.pbk";

            RasPhoneBook pbk = new RasPhoneBook();
            pbk.Open(path);

            foreach (RasEntry entry in pbk.Entries)
               System.Console.WriteLine((entry.Name));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望,我可以帮助你。