Программационно определить, подключен ли Cisco VPN -клиент

StackOverflow https://stackoverflow.com/questions/512365

  •  21-08-2019
  •  | 
  •  

Вопрос

Я работаю с основным клиентом 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 в вашем приложении, а затем проверьте строку, содержит ли она соответствующие данные - для получения дополнительной информации см. Здесь :

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

Ну, если все остальное не удается, проанализируйте вывод «маршрута». Маршрутизация, используемая Ciscovpn, имеет определенную отметку там.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top