Déterminer si Programmatically Cisco VPN Client est connecté
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.
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:
Eh bien, si tout le reste échoue, analyser la sortie de « route ». Le routage utilisé par CiscoVPN a une marque révélatrice là.