Livello di programmazione determinare se è collegato Cisco VPN Client
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.
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:
Beh, se tutto il resto fallisce, analizzare l'output di "percorso". Il percorso utilizzato da CiscoVPN ha un segno rivelatore lì.