Frage

Ich arbeite mit dem grundlegenden Cisco VPN -Client (V.5 glaube ich). Gibt es ohnehin, um programmatisch zu bestimmen, ob ein Teilprofil (oder ein Profil in dieser Angelegenheit) verbunden ist?

Ich möchte irgendwie einen Status vom Kunden selbst erhalten. Ich möchte nicht versuchen, am anderen Ende des VPN etwas IP zu pingen, um zu sehen, ob ich eine Antwort bekomme.

War es hilfreich?

Lösung

Es gibt eine API für Cisco VPN (vpnapi.dll).

Andere Tipps

Unterhalb eines VBS -Skripts, um den Verbindungsstatus zu überprüfen:

bIsVPNConnected = False

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration",,48) 

For Each objItem in colItems 
   strConnection = LCase(objItem.Description)

   If(InStr(strConnection, "cisco") > 0) Then
      wscript.echo (strConnection)
      bIsVPNConnected = objItem.IPEnabled
   End If
Next

If(bIsVPNConnected) Then
   WScript.echo  "VPN connected"
Else
   WScript.echo  "Not VPN connected"
End If

Ich bin mir keiner APIs für den Cisco VPN -Client bewusst, aber Sie könnten das zugrunde liegende Betriebssystem verwenden.

In Mac OS X können Sie das Systemkonfigurationsframework abfragen, da der Cisco VPN -Client eine Reihe von Schlüssel im Konfigurationsverzeichnis (DNS und Materials) erstellt:

$ printf "get State:/Network/Service/com.cisco.VPN" | sudo scutil

Das programmatische Äquivalent des oben genannten kann mit Carbon- oder OBJC -Kakao von C Carbon oder OBJ erreicht werden.

Wie "diciu" schrieb, können Sie das Systemkonfigurationsframework abfragen. Das programmatische Äquivalent des Scutil -Befehls, das er gegeben hat, ist so etwas wie

#import <SystemConfiguration/SystemConfiguration.h>

- (void)printPrimaryService {

    SCDynamicStoreRef dynamicStoreDomainState = SCDynamicStoreCreate(NULL,
                                                                     CFSTR("myApplicationName"),
                                                                     NULL,
                                                                     NULL);
    if (dynamicStoreDomainState) {
        NSString *netIPv4Key = [NSString stringWithFormat:@"%@/%@/%@/%@",
                                kSCDynamicStoreDomainState,
                                kSCCompNetwork,
                                kSCCompGlobal,
                                kSCEntNetIPv4];
        NSMutableDictionary *netIPv4Dictionary = (NSMutableDictionary *) SCDynamicStoreCopyValue(dynamicStoreDomainState, (CFStringRef)netIPv4Key);
        if (netIPv4Dictionary ) {
            NSString *primaryService = [netIPv4Dictionary objectForKey:(NSString *)kSCDynamicStorePropNetPrimaryService];
            if (primaryService) {
                NSLog(@"primary service = \"%@\"\n", primaryService);   /* When the Cisco VPN is active, I get "com.cisco.VPN" here */
            }
            [netIPv4Dictionary release];
        }
        CFRelease(dynamicStoreDomainState);
    }
}

Mit dem oben genannten können Sie feststellen, ob der Cisco VPN -Client verbunden ist. Sie können dann etwas Ähnliches tun, um die DNS -Server mit der VPN -Verbindung zugeordnet zu machen. Ich vergleiche die resultierenden DNS -Server mit dem DNS -Server meines Unternehmens, um festzustellen, ob ich in mein Unternehmen eingerichtet bin. Klunky, aber es funktioniert und es ist schnell - kein Timeout wartet auf einen Ping.

Beachten Sie, dass Cisco mit der jüngsten Version des Cisco VPN -Clients eine API veröffentlichte. Leider ist es nur für Microsoft Windows. Vielleicht produzieren sie eines Tages eine für Macs.

Es gibt tatsächlich verschiedene Möglichkeiten, ohne die API zu verwenden (die ich immer noch nicht finden kann/dl)

Eine der einfachsten Möglichkeiten ist die Überprüfung einer Registrierungseinstellung unter: hkey_local_maachine software cisco systems vpn client allaccess tunnelEstabled (0 oder 1)

Eine andere Möglichkeit besteht darin, dies mit dem Namen der Netzwerkschnittstelle zu erkennen, die sie durch die Verwendung von ManagementObjectSearcher, Beispielcode unten, festgelegt hat:

  ManagementObjectSearcher query = null;
                try { query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"); }
                catch (Exception ex)
                {

                }
                // "native code call stack error" 
                try { queryCollection = query.Get(); }
                catch (Exception ex)
                {

                }
                int i = 0;
                try
                {
                    foreach (ManagementObject mo in queryCollection)
                    {
                        MojPopisDostupnih[i] = mo["Description"].ToString();
                        // networksListBox.Items.Add(mo["Description"].ToString());
                        i = i + 1;
                    }
                    for (int j = 0; j <= MojPopisDostupnih.Length - 1; j++)
                    {
                        if (MojPopisDostupnih[j] != null)
                        {
                            if (MojPopisDostupnih[j].IndexOf("Cisco Systems VPN Adapter") != -1)
                            {  }
                            else 
                             {  }
                        }
                    }
                }
                catch (Exception ex)
                {

                }

Eine andere Möglichkeit besteht darin, den Prozess zu verwenden. STARTEN Sie eine CLI (Befehlszeile) von "VPNClient STAT" aus, leiten Sie die Standardausgabe an einen StringBuilder in Ihrer App weiter und überprüfen Sie dann die Zeichenfolge, ob sie geeignete Daten enthält - Weitere Informationen hierzu finden Sie hier :

http://www.cisco.com/en/us/docs/security/vpn_client/cisco_vpn_client/vpn_client46/administration/guide/vcach5.html

Wenn alles andere fehlschlägt, analysieren Sie die Ausgabe der "Route". Das von Ciscovpn verwendete Routing hat dort eine verräterische Marke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top