【问题标题】:Programatially determine if Cisco VPN Client is connected以编程方式确定 Cisco VPN 客户端是否已连接
【发布时间】:2010-10-05 11:17:49
【问题描述】:

我正在使用基本的 Cisco VPN 客户端(我相信是 v.5)。是否可以通过编程方式确定是否连接了特定配置文件(或任何相关配置文件)?

我希望以某种方式从客户端本身获得状态。我不想尝试 ping VPN 另一端的某个 IP 来查看是否得到响应。

【问题讨论】:

  • 你没有提到你感兴趣的语言/平台/vpn方法的细节,所以很难给出细节,但是当使用完整的vpn客户端软件时,会创建一个虚拟网络接口,您应该能够使用与查询任何其他网络接口相同的工具来查询启动/关闭状态。

标签: vpn cisco


【解决方案1】:

下面是一个检查连接状态的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

【讨论】:

  • 这在 2018 年仍然有效!如果将“\.\”替换为“\machine-name-here\”,它也适用于查询远程机器。 WMI 是查询机器配置的好工具。
【解决方案2】:

实际上有几种方法,不使用 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(命令行),将标准输出重定向到应用程序中的字符串生成器,然后检查字符串是否包含适当的数据 - 有关更多信息这个见这里:

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

【讨论】:

    【解决方案3】:

    正如“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 Client 中,Cisco 发布了一个 API。不幸的是,它仅适用于 Microsoft Windows。也许有一天他们会为 Mac 生产一款。

    【讨论】:

    • 我认为主要服务不一定是 VPN,在某些情况下我得到 VPN,但在其他情况下我得到物理 en0,即使 VPN 在列表中更远。
    【解决方案4】:

    如果一切都失败了,请解析“路由”的输出。 CiscoVPN 使用的路由有一个明显的标记。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

        上面的程序等效项可以在普通的 C Carbon 或 ObjC Cocoa 中实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-21
          • 2010-10-08
          • 2012-02-12
          • 2016-09-17
          • 1970-01-01
          • 2010-10-26
          • 2011-10-27
          • 2021-03-26
          相关资源
          最近更新 更多