以编程方式确定 Cisco *** 客户端是不是已连接
Posted
技术标签:
【中文标题】以编程方式确定 Cisco *** 客户端是不是已连接【英文标题】:Programatially determine if Cisco *** Client is connected以编程方式确定 Cisco *** 客户端是否已连接 【发布时间】:2010-10-05 11:17:49 【问题描述】:我正在使用基本的 Cisco *** 客户端(我相信是 v.5)。是否可以通过编程方式确定是否连接了特定配置文件(或任何相关配置文件)?
我希望以某种方式从客户端本身获得状态。我不想尝试 ping *** 另一端的某个 IP 来查看是否得到响应。
【问题讨论】:
你没有提到你感兴趣的语言/平台/***方法的细节,所以很难给出细节,但是当使用完整的***客户端软件时,会创建一个虚拟网络接口,您应该能够使用与查询任何其他网络接口相同的工具来查询启动/关闭状态。 【参考方案1】:下面是一个检查连接状态的vbs脚本:
bIs***Connected = 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)
bIs***Connected = objItem.IPEnabled
End If
Next
If(bIs***Connected) Then
WScript.echo "*** connected"
Else
WScript.echo "Not *** connected"
End If
【讨论】:
这在 2018 年仍然有效!如果将“\.\”替换为“\machine-name-here\”,它也适用于查询远程机器。 WMI 是查询机器配置的好工具。【参考方案2】:实际上有几种方法,不使用 API(我仍然找不到/DL)
最简单的方法之一是检查在以下位置找到的注册表设置: HKEY_LOCAL_MACHINE\SOFTWARE\Cisco Systems\*** 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 *** Adapter") != -1)
else
catch (Exception ex)
另一种方法是使用 process.start 运行“***client stat”的 CLI(命令行),将标准输出重定向到应用程序中的字符串生成器,然后检查字符串是否包含适当的数据 - 有关更多信息这个见这里:
http://www.cisco.com/en/US/docs/security/***_client/cisco_***_client/***_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 *** is active, I get "com.cisco.***" here */
[netIPv4Dictionary release];
CFRelease(dynamicStoreDomainState);
使用上述方法,您可以判断 Cisco *** 客户端是否已连接。然后,您可以执行类似的操作来获取与 *** 连接关联的 DNS 服务器。我将生成的 DNS 服务器与我公司的 DNS 服务器进行比较,以判断我是否通过 *** 进入了我的公司。 Klunky,但它可以工作而且速度很快 - 无需等待 ping 超时。
请注意,在最新版本的 Cisco *** Client 中,Cisco 发布了一个 API。不幸的是,它仅适用于 Microsoft Windows。也许有一天他们会为 Mac 生产一款。
【讨论】:
我认为主要服务不一定是 ***,在某些情况下我得到 ***,但在其他情况下我得到物理 en0,即使 *** 在列表中更远。【参考方案4】:如果一切都失败了,请解析“路由”的输出。 Cisco*** 使用的路由有一个明显的标记。
【讨论】:
【参考方案5】:Cisco *** (***api.dll) 有一个 API。
【讨论】:
【参考方案6】:我不知道 Cisco *** 客户端有任何 API,但您可以使用底层操作系统。
在 Mac OS X 上,您可以查询系统配置框架,因为当 Cisco *** 客户端连接时,它会在配置目录(DNS 等)中创建许多键:
$ printf "get State:/Network/Service/com.cisco.***" | sudo scutil
上面的程序等效项可以在普通的 C Carbon 或 ObjC Cocoa 中实现。
【讨论】:
以上是关于以编程方式确定 Cisco *** 客户端是不是已连接的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式确定是不是已安装 ActiveX 控件,以及它或整个 ActiveX 是不是已被禁用?
以编程方式验证 MDM 配置文件(配置)是不是已成功推送到 iOS 设备?
您能否以编程方式检查以确定您的 android 设备是不是处于深度睡眠模式?