【问题标题】:Find and start a VPN connection in VB .NET在 VB .NET 中查找并启动 VPN 连接
【发布时间】:2010-09-25 20:53:46
【问题描述】:

我正在使用NetworkInterface.GetAllNetworkInterfaces() 获取PC 上的所有接口。但是,这似乎只返回“活动”接口。如何在 .NET 中找到“非活动”网络接口,例如未连接的 VPN、禁用的 NIC 等。

我想在“控制面板”->“网络连接”中按名称找到它们。因此,例如,如果我有一个名为“我的工作”的 VPN,我希望能够使用“我的工作”这个名称找到它。

使用 Win32_NetworkAdapterConfiguration 似乎不是一个选项,因为它不会返回“网络连接”中显示的名称(据我所知)。

非常感谢,

RB。

【问题讨论】:

  • 我在下面的答案中添加了有关 Win32_NetworkAdapter 类的信息 - 希望这更符合您的要求
  • 感谢 Paul - 现在正在调查。我有一个特定于 VPN 的解决方案,其中涉及到“rasdial.exe”,但它不是......漂亮......无论如何我会在几分钟内发布它以获取信息!

标签: .net vb.net windows-xp network-programming


【解决方案1】:

这个使用 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 类可能会让您更幸运 - 它具有标题和描述属性,可能为您提供所需的内容。有一种方法可以将此信息与我提到的上一课程联系起来,以获取 IP 地址等 - 如果没有进一步研究,不确定它是什么,但如果您需要知道,请告诉我。

【讨论】:

  • 嗨,保罗。 “NetConnectionID”将显示我的 NIC 的名称(例如“本地连接”),但不会为我的 VPN 显示此名称,即使它已连接。不过感谢您的帮助。
【解决方案2】:

好的,这是我用来检测命名 VPN 的 hacky 解决方案。如果由于某种原因(包括网络连接断开、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

【讨论】:

    【解决方案3】:

    好的 - 最后的努力:)

    Win32_NetworkConnection 类怎么样 - 我很确定这将处理 VPN 连接

    【讨论】:

    • 在我的机器上,这显示了我所有的映射驱动器,以及我打开的所有网络共享。它不显示 VPN,即使它们已连接 :-( 感谢您的帮助 :-)
    • 臭虫 - 你需要的信息必须在 WMI 的某个地方 - 只是通过文档找到正确的类的一个案例 :o( 很高兴你找到了解决方法
    【解决方案4】:
    RasDialer dialer = new RasDialer();
    ReadOnlyCollection<RasConnection> connections = dialer.GetActiveConnections();
    
    foreach (RasConnection connection in connections)
    {
        // Do what you want to with the connections.
    }
    

    这将检索 Windows 正在使用的所有已连接拨号条目(包括 VPN 连接)及其相关句柄和其他信息。

    该组件是 CodePlex 上 DotRas 项目的一部分。

    http://www.codeplex.com/DotRas

    【讨论】:

    • 嗨,Jeff,这正是我想要的正是。稍后我将下载源代码,以了解您是如何编写如此神奇的魔法的!非常非常感谢:-)
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2011-12-16
    • 2019-04-09
    • 1970-01-01
    • 2011-12-29
    • 2014-08-13
    相关资源
    最近更新 更多