Pergunta

Estou trabalhando com o cliente básico da Cisco VPN (v.5, acredito). Existe alguma maneira de determinar programaticamente se um perfil partciular (ou qualquer perfil para esse assunto) estiver conectado?

Estou procurando de alguma forma obter um status do próprio cliente. Não quero ter que tentar ping algum IP do outro lado da VPN para ver se eu recebo uma resposta.

Foi útil?

Solução

Existe uma API para Cisco VPN (vpnapi.dll).

Outras dicas

Abaixo de um script VBS para verificar o status da conexão:

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

Não tenho conhecimento de nenhuma APIs para o cliente da Cisco VPN, mas você pode usar o sistema operacional subjacente.

No Mac OS X, você pode consultar a estrutura de configuração do sistema, porque quando o cliente Cisco VPN conecta, cria várias chaves no diretório de configuração (DNS e outras coisas):

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

O equivalente programático do exposto acima pode ser alcançado em carbono C ou Cocoa de Objc.

Como "Diciu" escreveu, você pode consultar a estrutura de configuração do sistema. O equivalente programático do comando de Scutil que ele deu é algo 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 o acima, você pode saber se o cliente Cisco VPN está conectado. Você pode fazer algo semelhante para obter os servidores DNS associados à conexão VPN. Comparo os servidores DNS resultantes com o servidor DNS da minha empresa para saber se estou vpn'd na minha empresa. Klunky, mas funciona e é rápido - sem esperar por um ping no tempo limite.

Observe que, com a versão recente do cliente Cisco VPN, a Cisco publicou uma API. Infelizmente, é apenas para o Microsoft Windows. Talvez eles produzam um para Macs algum dia.

Existem várias maneiras, na verdade, sem usar a API (que ainda não consigo encontrar/dl)

Uma das maneiras mais fáceis é verificar uma configuração de registro encontrada em: hkey_local_machine software cisco systems vpn client allaccess tunnestabled (0 ou 1)

Outra maneira é fazê -lo é detectá -lo com o nome da interface de rede que ele estabelece por meio do uso do ManagementObjectSearcher, código de exemplo abaixo:

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

                }

Outra maneira é usar o processo. :

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

Bem, se tudo mais falhar, analise a saída de "rota". O roteamento usado pelo Ciscovpn tem uma marca reveladora lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top