Pregunta

Estoy trabajando con el cliente VPN básico de Cisco (v.5, creo). ¿Hay de alguna manera para determinar programáticamente si un perfil parciular (o algún perfil para el caso) está conectado?

Estoy buscando obtener de alguna manera un estado del cliente mismo. No quiero tener que intentar hacer ping un poco de IP en el otro extremo de la VPN para ver si obtengo una respuesta.

¿Fue útil?

Solución

Hay una API para Cisco VPN (vpnapi.dll).

Otros consejos

Debajo de un script VBS para verificar el estado de conexión:

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

No soy consciente de ninguna API para el cliente VPN de Cisco, pero podría usar el sistema operativo subyacente.

En Mac OS X, puede consultar el marco de configuración del sistema porque cuando Cisco VPN Client lo conecta crea una serie de claves en el directorio de configuración (DNS y cosas):

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

El equivalente programático de lo anterior se puede lograr en el carbono C simple u cacao OBJC.

Como escribió "Diciu", puede consultar el marco de configuración del sistema. El equivalente programático del comando scutil que dio es algo así como

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

Usando lo anterior, puede saber si el cliente Cisco VPN está conectado. Luego puede hacer algo similar para obtener los servidores DNS asociados con la conexión VPN. Comparo los servidores DNS resultantes con el servidor DNS de mi empresa para decir si estoy en mi empresa. Klunky, pero funciona y es rápido, no esperar a que un ping sea un tiempo de espera.

Tenga en cuenta que con la versión reciente del cliente VPN de Cisco, Cisco publicó una API. Desafortunadamente, es solo para Microsoft Windows. Tal vez producirán uno para Mac algún día.

Hay varias maneras, en realidad, sin usar la API (que todavía no puedo encontrar/DL)

Una de las formas más fáciles es verificar una configuración del registro que se encuentra en: HKEY_LOCAL_MACHINE Software Cisco Systems VPN Client AllAccess TunnelEplable (0 o 1)

Otra forma es hacerlo es detectarlo con el nombre de la interfaz de red que establece mediante el uso de ganagementObjectSearcher, código de muestra a continuación:

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

                }

Otra forma más es usar process.star para ejecutar una CLI (línea de comando) de "estadísticas vpnclient", redirigir la salida estándar a un stringBuilder en su aplicación y luego verificar la cadena si contiene datos apropiados; para obtener más información sobre esto, consulte aquí. :

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

Bueno, si todo lo demás falla, analice la salida de "ruta". El enrutamiento utilizado por CISCOVPN tiene una marca reveladora allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top