Программно определить, подключен ли Cisco VPN Client - PullRequest
5 голосов
/ 04 февраля 2009

Я работаю с базовым клиентом Cisco VPN (я полагаю, v.5). Есть ли какой-либо способ определить программно, подключен ли частичный профиль (или любой другой профиль)?

Я пытаюсь как-то получить статус от самого клиента. Я не хочу пытаться пропинговать какой-либо IP-адрес на другом конце VPN, чтобы посмотреть, получу ли я ответ.

Ответы [ 6 ]

2 голосов
/ 04 марта 2016

Ниже сценария 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
1 голос
/ 07 июля 2011

Есть несколько способов, на самом деле, без использования API (который я до сих пор не могу найти / DL)

Один из самых простых способов - проверить настройки реестра, которые находятся по адресу: HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Cisco Systems \ VPN-клиент \ AllAccess \ TunnelEstablished (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», перенаправить стандартный вывод на построитель строк в вашем приложении и затем проверить строку, содержит ли она соответствующие данные - для получения дополнительной информации это см. здесь:

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

1 голос
/ 26 апреля 2011

Как писал "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-сервером моей компании, чтобы узнать, подключен ли я к VPN. Klunky, но работает и работает быстро - не нужно ждать пинга до тайм-аута.

Обратите внимание, что в последней версии Cisco VPN Client Cisco опубликовала API. К сожалению, это только для Microsoft Windows. Может быть, они когда-нибудь выпустят его для Mac.

1 голос
/ 02 марта 2010

Существует API для Cisco VPN (vpnapi.dll).

1 голос
/ 05 февраля 2009

Мне неизвестно о каких-либо API-интерфейсах для клиента Cisco VPN, но вы можете использовать базовую ОС.

В Mac OS X вы можете запросить инфраструктуру конфигурации системы, поскольку при подключении клиента Cisco VPN он создает несколько ключей в каталоге конфигурации (DNS и другие):

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

Программный эквивалент вышеупомянутого может быть достигнут в обычном углероде C или ObjC Cocoa.

0 голосов
/ 02 марта 2010

Хорошо, если ничего не помогает, проанализируйте вывод "route". Маршрутизация, используемая CiscoVPN, имеет там контрольную отметку.

...