.net - Fange VPN brugsstatistik

Indlæg af Hanne Mølgaard Plasc

Problem



Vi overvåger brugsstatistikker for en netværksgrænseflade ved hjælp af NetworkInterface.GetIPv4Statistics () i .NET 2.0. Dette rapporterer ikke korrekt statistik for forbindelser, over hvilke VPN-trafik bliver tunnelet. I stedet for - i tilfælde af Cisco VPN-klienten - tilskrives brugen kun en ny netværksgrænseflade, der bare ligner en Ethernet-forbindelse.


Windows i sig selv (Vista, i det mindste) tilføjer VPN-statistikkerne til den faktiske fysiske grænseflade korrekt, så visning af 'Status' -dialogen for den oprindelige forbindelse viser de korrekte byte-tæller. Resultaterne af opkaldet i. NET fusionerer imidlertid ikke trafikken sammen.


Er der en måde at knytte VPN-forbindelsen tilbage til den netværksforbindelse, over hvilken den er tunnelet? Hvis det ikke er tilfældet, ved der nogen, hvilken API der bruges af statusdialogen til at hente korrekt statistik?


I øjeblikket er vi nødt til manuelt at opdage forbindelser, der ligner de er VPN'er og tilføje deres brug til, hvad andre forbindelser er aktive, og det ser ikke ud som en robust løsning.

Bedste reference


Her er et program skrevet i Delphi (med fuld kilde og forklaring), der hjælper dig med at indsamle netværksoplysninger, herunder VPN-data. Dette bruger Indy-komponenterne fra open source, som også er tilgængelig til brug med C #. [3]]] [4]


Jeg foreslår browsing gennem kilden, og du finder de nøjagtige Windows API-opkald, det gør. Den er afhængig af HELT på IP Helper API (IPHlpApi). [5]


Hvis du søger C # kun eksempler, foreslår jeg at gøre nogle google-ing til 'C # og IpHlpApi'.


Hilsen


alt tekst http://z.about.com/d/delphi/1/0/k/2/112903\_2.gif[6]

Andre referencer 1


Jeg bliver nødt til at kontrollere, hvornår min konfiguration ligner, når jeg kommer på arbejde.


En ting, som Cisco VPN gør, er, hvis det er konfigureret, at deaktivere delt tunneling. Hvad det betyder er, at du forhindres i at få adgang til dit lokale undernet på den forbindelse, der er forbundet til VPN.


Den måde, jeg kan se dette på, er, når min Ethernet-forbindelse er konfigureret med en IP-adresse, men har ikke en Default Gateway.


Hvis du antager, at du identificerer VPN-forbindelsen, vil den gateway-mindre forbindelse være din anden forbindelse.


Har du også kigget på nogen WMI-klasser. Cisco VPN kan muligvis interagere med en WMI-klasse.

Andre referencer 2


Som Rob foreslår, ligger svaret i WMI. Win32\_PerfFormattedData\_RemoteAccess\_RasPort synes at være præcis hvad Windows bruger sig selv - tallene er de samme, byte for byte, om VPN'en er op eller ej. [7]


Jeg testede med:


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"]);
    }
}