以编程方式确定Cisco VPN客户端是否已连接

时间:2009-02-04 17:18:51

标签: vpn cisco

我正在使用基本的Cisco VPN客户端(我相信第5版)。无论如何,如果连接了一个partcular配置文件(或任何配置文件),是否以编程方式确定?

我希望以某种方式从客户端获取状态。我不想尝试在VPN的另一端ping一些IP,看看我是否得到了响应。

6 个答案:

答案 0 :(得分:2)

在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 :(得分:1)

我不知道任何用于Cisco VPN客户端的API,但您可以使用底层操作系统。

在Mac OS X上,您可以查询系统配置框架,因为当Cisco VPN客户端连接时,它会在配置目录(DNS和内容)中创建许多密钥:

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

上述程序上的等价物可以用普通C Carbon或ObjC Cocoa来实现。

答案 2 :(得分:1)

Cisco VPN(vpnapi.dll)有一个API。

答案 3 :(得分:1)

正如“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客户端是否已连接。然后,您可以执行类似操作以获取与VPN连接关联的DNS服务器。我将生成的DNS服务器与我公司的DNS服务器进行比较,以判断我是否已将VPN连接到我的公司。 Klunky,但它运行起来很快 - 没有等待ping超时。

请注意,使用最新版本的Cisco VPN客户端,思科发布了一个API。不幸的是,它仅适用于Microsoft Windows。也许有一天他们会为Mac制作一个。

答案 4 :(得分:1)

实际上,有几种方法可以不使用API​​(我仍然无法找到/ DL)

最简单的方法之一是检查在以下位置找到的注册表设置: HKEY_LOCAL_MACHINE \ SOFTWARE \ Cisco Systems \ VPN Client \ 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运行“vpnclient stat”的CLI(命令行),将标准输出重定向到应用程序中的stringbuilder,然后检查字符串是否包含适当的数据 - 有关详细信息,请参阅这看到这里:

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

答案 5 :(得分:0)

如果所有其他方法都失败了,解析“route”的输出。 CiscoVPN使用的路由在那里有一个明显的标记。