Найти и запустить VPN-соединение в VB .NET - PullRequest
2 голосов
/ 08 декабря 2008

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

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

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

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

RB.

Ответы [ 4 ]

1 голос
/ 25 марта 2009
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

1 голос
/ 08 декабря 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
1 голос
/ 08 декабря 2008

Этот пример с использованием 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 class

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

0 голосов
/ 08 декабря 2008

ОК - Последнее усилие в канаве:)

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

...