Question

Je travaille avec le client VPN Cisco de base (v.5 je crois). Y at-il de toute façon de déterminer si un profil programatically partciular (ou tout autre profil pour cette matière) est connecté?

Je cherche à obtenir en quelque sorte un statut du client lui-même. Je ne veux pas avoir à essayer de ping IP une à l'autre bout du VPN pour voir si je reçois une réponse.

Était-ce utile?

La solution

Il existe une API pour Cisco VPN (vpnapi.dll).

Autres conseils

Ci-dessous un script VBS pour vérifier l'état de connexion:

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

Je ne connais aucune API pour le client Cisco VPN mais vous pouvez utiliser le système d'exploitation sous-jacent.

Sous Mac OS X, vous pouvez interroger le cadre de configuration du système, car lorsque le client VPN Cisco se connecte il crée un certain nombre de clés dans le répertoire de configuration (DNS et d'autres choses):

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

L'équivalent programmatique de la peut être obtenu ci-dessus dans la plaine C carbone ou ObjC cacao.

« diciu » a écrit, vous pouvez interroger le cadre de configuration du système. L'équivalent programmatique de la commande scutil qu'il a quelque chose comme

#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);
    }
}

En utilisant ce qui précède, vous pouvez dire si le client VPN Cisco est connecté. Vous pouvez alors faire quelque chose de similaire pour obtenir les serveurs DNS associés à la connexion VPN. Je compare les serveurs DNS résultant au serveur DNS de mon entreprise pour savoir si je suis VPN'd en ma compagnie. Klunky, mais il fonctionne et il est rapide -. Pas d'attente pour un ping de délai d'attente

Notez que la version récente du client VPN Cisco, Cisco a publié une API. Malheureusement, il est seulement pour Microsoft Windows. Peut-être qu'ils vont produire un pour Mac un jour.

Il y a plusieurs façons, en fait, sans utiliser l'API (que je trouve toujours / DL dévers)

L'une des façons les plus simples est de vérifier un paramètre de Registre à l'adresse: HKEY_LOCAL_MACHINE \ SOFTWARE \ Cisco Systems \ VPN Client \ AllAccess \ TunnelEstablished (0 ou 1)

Une autre façon est de le faire est de détecter par le nom de l'interface réseau, il établit par l'intermédiaire de l'utilisation ManagementObjectSearcher, un exemple de code ci-dessous:

  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)
                {

                }

Une autre façon est d'utiliser Process.Start pour exécuter une CLI (ligne de commande) de « vpnclient stat », rediriger la sortie standard à un stringbuilder dans votre application, puis vérifier la chaîne si elle contient des données appropriées - pour plus d'informations sur ce sujet, voir ici:

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

Eh bien, si tout le reste échoue, analyser la sortie de « route ». Le routage utilisé par CiscoVPN a une marque révélatrice là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top