Найдите и запустите VPN-соединение в VB .NET

Я использую NetworkInterface.GetAllNetworkInterfaces() чтобы получить все интерфейсы на ПК. Однако это, похоже, возвращает только «активные» интерфейсы. Как я могу найти «неактивные» сетевые интерфейсы, такие как неподключенные VPN, отключенные сетевые карты и т. д. в .NET.

Я хотел бы найти их по имени в "Панель управления" -> "Сетевые подключения". Так, например, если у меня есть VPN под названием «Моя работа», я хотел бы иметь возможность найти ее по имени «Моя работа».

Использование Win32_NetworkAdapterConfiguration не представляется возможным, поскольку оно не возвращает имя, показанное в «Сетевых подключениях» (насколько я вижу).

Большое спасибо,

RB.


person RB.    schedule 08.12.2008    source источник
comment
Я добавил информацию о классе Win32_NetworkAdapter в свой ответ ниже - надеюсь, это больше соответствует тому, что вы ищете.   -  person Paul Nearney    schedule 08.12.2008
comment
Спасибо, Пол - сейчас разбираюсь. У меня есть специальное решение для VPN, которое включает в себя использование rasdial.exe, но оно не... красивое... Я все равно опубликую его для информации через минуту!   -  person RB.    schedule 08.12.2008


Ответы (4)


RasDialer dialer = new RasDialer();
ReadOnlyCollection<RasConnection> connections = dialer.GetActiveConnections();

foreach (RasConnection connection in connections)
{
    // Do what you want to with the connections.
}

Это позволит получить все подключенные удаленные подключения (включая VPN-подключения), которые используются Windows, а также связанные с ними дескрипторы и другую информацию.

Этот компонент является частью проекта DotRas на CodePlex.

http://www.codeplex.com/DotRas

person Community    schedule 25.03.2009
comment
Привет, Джефф, это именно то, что я искал. Я собираюсь скачать исходный код позже, чтобы узнать, как вы запрограммировали такое магическое волшебство! Большое большое спасибо :-) - person RB.; 26.03.2009

Этот пример с использованием WMI может помочь вам (кстати, извините за C#!):

using System.Management;

string query = "SELECT * FROM Win32_NetworkAdapterConfiguration";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();

// Every record in this collection is a network interface
foreach (ManagementObject mo in moCollection)
{
    // Do what you need to here....
}

Для проверки того, включен адаптер или нет, эта ссылка должна помочь:

класс Win32_NetworkAdapterConfiguration

Изменить: вам может повезти с Win32_NetworkAdapter class — у него есть свойства Caption и Description, которые могут дать вам то, что вам нужно. Есть способ связать эту информацию с предыдущим классом, о котором я упоминал, для получения IP-адресов и т. д. — не уверен, что это такое, без дальнейших исследований, но дайте мне знать, если вам нужно знать.

person Paul Nearney    schedule 08.12.2008
comment
Привет, Пол. NetConnectionID покажет имя (например, «Подключение по локальной сети») для моей сетевой карты, но не покажет его для моей VPN, даже если она подключена. Спасибо за вашу помощь. - person RB.; 08.12.2008

Хорошо, это хакерское решение, которое я нашел для обнаружения именованных VPN. Он выдаст ошибку, если по какой-либо причине не сможет подключиться к VPN (включая сетевое соединение, VPN не существует и т. д.).

Конкретные коды ошибок для проверки включают:

Ошибка удаленного доступа 800 — Не удалось установить VPN-подключение.
Возможно, VPN-сервер недоступен, или для этого подключения неправильно настроены параметры безопасности.

Ошибка удаленного доступа 623. Системе не удалось найти запись в телефонной книге для этого подключения.

На самом деле это не отвечает на мой вопрос в том виде, в каком он задан (хотя он достаточно хорошо работает для реальной проблемы).

Dim p As New Process

p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.StartInfo.FileName = "rasdial.exe"
p.StartInfo.Arguments = """Company HQ"""
p.Start()
If Not p.WaitForExit(My.Settings.VpnTimeout) Then
    Throw New Exception( _
String.Format("Connecting to ""{0}"" VPN failed after {1}ms", sVpn, My.Settings.VpnTimeout))
End If

If p.ExitCode <> 0 Then
    Throw New Exception( _
String.Format("Failed connecting to ""{0}"" with exit code {1}. Errors {2}", sVpn, p.ExitCode, p.StandardOutput.ReadToEnd.Replace(vbCrLf, "")))
End If
person RB.    schedule 08.12.2008

ОК - последнее усилие :)

Как насчет класса Win32_NetworkConnection — я почти уверен, что это будет обрабатывать VPN-соединения

person Paul Nearney    schedule 08.12.2008
comment
На моей машине это показывает все мои подключенные диски и все открытые сетевые ресурсы. Он не показывает VPN, даже если они подключены :-( Спасибо за вашу помощь :-) - person RB.; 08.12.2008
comment
Bugger - нужная вам информация должна быть где-то в WMI - просто случай, когда вы просматриваете документацию, чтобы найти правильный класс: o( Рад, что вы нашли обходной путь - person Paul Nearney; 08.12.2008