Программационно определить, подключен ли Cisco VPN -клиент
Вопрос
Я работаю с основным клиентом Cisco VPN (я считаю, что v.5). Есть ли в любом случае, чтобы программно определять, подключен ли частичный профиль (или какой -либо профиль) подключен?
Я как -то хочу получить статус от самого клиента. Я не хочу пытаться пинговать IP на другом конце VPN, чтобы увидеть, получу ли я ответ.
Решение
Есть API для Cisco VPN (vpnapi.dll).
Другие советы
Ниже скрипта VBS, чтобы проверить статус соединения:
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
Я не знал о каких -либо API для клиента Cisco VPN, но вы можете использовать основную ОС.
На Mac OS X вы можете запросить структуру конфигурации системы, потому что, когда клиент Cisco VPN подключается, он создает ряд клавиш в каталоге конфигурации (DNS и прочее):
$ printf "get State:/Network/Service/com.cisco.VPN" | sudo scutil
Программный эквивалент вышеперечисленного может быть достигнут в простом C Carbon или Objc Cocoa.
Как пишет "DICIU", вы можете запросить структуру конфигурации системы. Программный эквивалент команды Scutil, которую он дал, - это что -то вроде
#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);
}
}
Используя вышесказанное, вы можете сказать, подключен ли клиент Cisco VPN. Затем вы можете сделать что -то похожее, чтобы получить DNS -серверы, связанные с соединением VPN. Я сравниваю полученные DNS -серверы с DNS -сервером моей компании, чтобы сказать, если я буду в своей компании. Клунки, но это работает, и это быстро - не ждет пинга в тайм -аут.
Обратите внимание, что с недавней версией клиента Cisco VPN Cisco опубликовал API. К сожалению, это только для Microsoft Windows. Может быть, они когда -нибудь будут производить его для Mac.
На самом деле есть несколько способов, не используя API (который я все еще не могу найти/dl)
Один из самых простых способов - проверить настройку реестра, найденную по адресу: hkey_local_machine Software Cisco Systems VPN Client Allaccess Tunnelestableded (0 или 1)
Другой способ - это сделать, чтобы обнаружить его по имени сетевого интерфейса, который он устанавливает с помощью ManagementObjectSearcher, пример кода ниже:
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)
{
}
Еще один способ - использовать Process.start для запуска CLI (командная строка) «vpnClient Stat», перенаправить стандартный вывод на StringBuilder в вашем приложении, а затем проверьте строку, содержит ли она соответствующие данные - для получения дополнительной информации см. Здесь :
Ну, если все остальное не удается, проанализируйте вывод «маршрута». Маршрутизация, используемая Ciscovpn, имеет определенную отметку там.