捕获VPN使用情况统计信息

时间:2009-02-19 15:09:38

标签: .net windows networking vpn cisco

我们正在使用.NET 2.0中的NetworkInterface.GetIPv4Statistics()监控网络接口的使用情况统计信息。这不会报告通过隧道传输VPN流量的连接的正确统计信息。相反 - 在Cisco VPN客户端的情况下 - 使用仅仅归因于看起来像以太网连接的新网络接口。

Windows本身(至少是Vista)正确地将VPN统计信息添加到实际物理接口,因此查看原始连接的“状态”对话框会显示正确的字节数。但是,.NET中调用的结果不会将流量合并在一起。

有没有办法将VPN连接关联到通过其进行隧道传输的网络连接?如果不这样做,是否有人知道状态对话框正在使用哪个API来检索正确的统计信息?

目前我们不得不手动检测看起来像VPN的连接,并将其用途添加到其他任何活动连接中,这似乎不是一个强大的解决方案。

3 个答案:

答案 0 :(得分:2)

Here's a program written in Delphi(完整的来源和解释)将帮助您收集网络信息,包括VPN数据。这是使用open-source Indy components,它也可用于C#。

我建议浏览源代码,然后你会发现它所做的确切的Windows API调用。它在IP Helper API(IPHlpApi)上依赖HEAVILY。

如果您正在寻找仅限C#的示例,我建议您为“C#和IpHlpApi”进行一些谷歌搜索。

此致

alt text http://z.about.com/d/delphi/1/0/k/2/112903_2.gif

答案 1 :(得分:1)

我必须检查我什么时候去看看我的配置是什么样的。

Cisco VPN所做的一件事是,如果配置,则禁用拆分隧道。这意味着您无法访问连接到VPN的连接上的本地子网。

我可以看到这种情况,就是我的以太网连接配置了IP地址,但没有默认网关。

假设您识别VPN连接,那么无网关连接将是您的另一个连接。

另外,您是否查看了任何WMI类。 Cisco VPN可能与WMI类进行交互。

答案 2 :(得分:0)

正如Rob所说,答案在于WMI。 Win32_PerfFormattedData_RemoteAccess_RasPort似乎正是Windows自己使用的 - 数字是相同的,字节是字节,无论VPN是否启用。

我测试过:

static class Program
{
    static void Main()
    {
        var query = new WqlEventQuery("__InstanceModificationEvent", TimeSpan.FromSeconds(1),
                                      "TargetInstance ISA 'Win32_PerfFormattedData_RemoteAccess_RasPort' AND TargetInstance.BytesReceived > 0");

        var watcher = new ManagementEventWatcher(query);
        watcher.EventArrived += EventArrived;
        watcher.Start();

        Console.ReadLine();
    }

    static void EventArrived(object sender, EventArrivedEventArgs e)
    {
        var mo = e.NewEvent["TargetInstance"] as ManagementBaseObject;
        Console.WriteLine("{0:#,0}: {1:#,0} bytes sent, {2:#,0} bytes received", mo["Name"], mo["BytesTransmitted"], mo["BytesReceived"]);
    }
}