Domanda

sto lavorando con il client Cisco VPN di base (v.5 credo). Esiste un modo per determinare programatically se è collegato un profilo partciular (o qualsiasi profilo per questo)?

Sto cercando di ottenere in qualche modo uno status da parte del cliente stesso. Io non voglio avere a cercare di rumore metallico alcuni IP su l'altra estremità del VPN per vedere se ho una risposta.

È stato utile?

Soluzione

C'è un'API per Cisco VPN (vpnapi.dll).

Altri suggerimenti

Di seguito uno script VBS per verificare lo stato della connessione:

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

Sono a conoscenza di API per client VPN Cisco, ma è possibile utilizzare il sistema operativo sottostante.

In Mac OS X, è possibile interrogare il quadro di configurazione del sistema, perché quando client VPN Cisco collega crea una serie di chiavi nella directory di configurazione (DNS e roba):

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

L'equivalente programmatico quanto sopra può essere conseguito in C puro carbonio o objC Cocoa.

"diciu" ha scritto, è possibile interrogare il quadro di configurazione del sistema. L'equivalente programmatico del comando scutil che ha dato è qualcosa di simile

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

Utilizzando quanto sopra, si può dire se è collegato il client VPN Cisco. È quindi possibile fare qualcosa di simile per ottenere i server DNS associati alla connessione VPN. Io paragono le conseguenti server DNS al server DNS della mia azienda per dire se sono VPN'd nella mia azienda. Klunky, ma funziona ed è veloce -. Nessuna attesa per un ping di timeout

Si noti che con la versione recente del client VPN Cisco, Cisco ha pubblicato un'API. Purtroppo, è solo per Microsoft Windows. Forse ti producono una per Mac, un giorno.

Ci sono diversi modi, in realtà, senza utilizzare l'API (che ho ancora cant find / DL)

Uno dei modi più semplici è quello di controllare un registro di impostazione disponibili all'indirizzo: HKEY_LOCAL_MACHINE \ SOFTWARE \ Client di Cisco Systems \ VPN \ AllAccess \ TunnelEstablished (0 o 1)

Un altro modo è quello di farlo è quello di rilevarla con il nome dell'interfaccia di rete stabilisce tramite usando ManagementObjectSearcher, codice di esempio riportato di seguito:

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

                }

Un altro modo è quello di utilizzare Process.Start di eseguire una CLI (command line) di "vpnclient stat", reindirizzare l'output standard ad uno StringBuilder nella vostra app e quindi controllare la stringa se contiene i dati appropriati - per più informazioni questo vedere qui:

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

Beh, se tutto il resto fallisce, analizzare l'output di "percorso". Il percorso utilizzato da CiscoVPN ha un segno rivelatore lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top